这是代码:
IDefaultInterface.aj:
public interface IDefaultInterface {
public void m1();
static aspect Impl{
public int f1;
public void IDefaultInterface.m1(){
}
}
}
DefaulstInterfaceClass.java:
public class DefaultInterfaceClass implements IDefaultInterface {
@Override
public void m1() {
}
void mm() {
f1 = 9;
}
}
在第二段代码中,我试图覆盖m1()方法并访问f1字段。编译器不允许任何一个。
如何克服这些限制?
其他想法。我不会怀疑,如果在“AspectJ in action”2版中没有说过使用这个成语,效果应该是相同的“扩展两者的默认实现(如果在Java中允许多重继承)。”我相信多数与C ++相关的多重继承。那么,为什么不提供人们习惯的语义呢?
答案 0 :(得分:0)
我不熟悉AspectJ,但我看到了一些值得怀疑的事情:你的方面是试图在界面中定义一个非抽象方法,而你的类试图访问字段f1,就像它拥有该字段一样,当你在方面声明f1时。我不太确定你在这里要做什么,但我不认为你会以正确的方式去做。
答案 1 :(得分:0)
首先,我拼错了f1声明。它应该是
public int IDefaultInterface.f1;
它解决了访问字段问题。
使用以下代码解决了第二个问题:
public interface IDefaultInterface {
public void m1();
public static interface Impl extends IDefaultInterface{
static aspect Implementation{
public int IDefaultInterface.Impl.f1;
public void IDefaultInterface.Impl.m1(){
}
}
}
}
然后:
public class DefaultInterfaceClass implements IDefaultInterface.Impl ....