使用习语“提供默认接口实现”时,无法覆盖方法并且无法访问字段

时间:2011-08-21 17:37:55

标签: java aspectj mixins idioms

这是代码:
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 ++相关的多重继承。那么,为什么不提供人们习惯的语义呢?

2 个答案:

答案 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 ....