在不同的类层次结构中重复使用相同的类

问题描述 投票:0回答:1

有时候您的回调接口有多个回调方法,每种方法都用于不同类型的事件。一个示例是org.xml.sax.ContentHandler,其具有startElement()characters()等。>

有时您希望拥有一组可重复使用的处理程序,并以任意顺序链接它们。在Java中,它由委托设计模式解决:您创建一个实现该接口的每个方法的抽象类,请参见:

javax.xml.stream.util.StreamReaderDelegate
org.xml.sax.helpers.XMLFilterImpl
com.common.util.xml.DelegatingContentHandler

然后扩展该抽象类,使其仅覆盖所需的方法,然后在运行时中创建处理程序链,将下一个委托传递给前一个委托的构造函数。

[我想知道AspectJ的declare parents是否允许静态创建此类链。我不想手动为接口创建委托类,也不想在运行时创建链。

这是我到目前为止所做的:共有3个类:A,B,C,它们打印其名称,然后调用super。我想为每个可能的配对创建类:AB,AC,BC,它们具有一对配对的功能。

我的程序的期望输出:

ASupport
BSupport
===============
BSupport
CSupport
===============
ASupport
CSupport
===============

无法编译的程序:

package org.foo;

public class AnAspect {

    public static void main(String[] args) {
        new AB().handle(null);
        new BC().handle(null);
        new AC().handle(null);
    }

}

aspect AnAspect1 {
    declare parents : AB extends ASupport;

    // can only insert a class into hierarchy, but org.foo.BSupport is not a subtype of org.foo.CSupport
    declare parents : ASupport extends BSupport;
}

aspect AnAspect2 {
    declare parents : BC extends BSupport;
    declare parents : BSupport extends CSupport;
}

aspect AnAspect3 {
    declare parents : AC extends ASupport;
    declare parents : ASupport extends CSupport;
}

class BC extends MyCallback {

}

class AC extends MyCallback {

}

class AB extends MyCallback {

}

class ASupport extends MyCallback {

    @Override
    public void handle(Object o) {
        System.out.println("ASupport");
        super.handle(o);
    }

}

class BSupport extends MyCallback {

    @Override
    public void handle(Object o) {
        System.out.println("BSupport");
        super.handle(o);
    }

}

class CSupport extends MyCallback {

    @Override
    public void handle(Object o) {
        System.out.println("CSupport");
        super.handle(o);
    }

}

abstract class MyCallback {

    public void handle(Object o) {
        System.out.println("===============");
    }

}

有时候您的回调接口有多个回调方法,每种方法都用于不同类型的事件。一个示例是org.xml.sax.ContentHandler,它具有startElement(),characters()等。有时...

java aop aspectj
1个回答
0
投票

当然,您不能通过AspectJ克服JVM的限制,并使ASupport扩展BSupportCSupport。每个类都必须具有一个超类(或没有一个,在这种情况下,它隐式继承自Object)。同样,变体declare parents : CSupport extends ASupport;无效,因为它会导致圆形层次结构,这当然是禁止的,因为它没有逻辑意义。

© www.soinside.com 2019 - 2024. All rights reserved.