使覆盖方法的超级引用超类超级

时间:2016-05-29 12:10:20

标签: java inheritance bukkit

我知道标题可能听起来有点奇怪,但这正是我愿意做的。简单解释: Class Aclass B的子类,class B也是class C的子类。

现在,所有这些类都包含方法m()。在我的A类中,我唯一可以访问的类,因为其他类只在运行时可用,我覆盖了B类的m()方法。 但是,m()类的B方法包含对其自己的超类(m())的C方法的调用,尽管我对其进行了一些修改它,我最终还要打电话给那个方法。

我已经搜索了一段时间,我听说在类似情况下这是不可能的,因为它会“打破封装”,我真的明白为什么。但是,在我的情况下,我在覆盖方法中完成所有操作,所以有什么方法可以实现它,所以它会这样工作吗?谢谢!

编辑: 啊,我想我没有好好解释安静。我只是在我的C类中重写了B类的方法。从那里开始,在我的C类方法中,我需要调用m()方法而不是B类(这对于super.m()有效),但是对于C类。

这是我的实际代码,如果有帮助的话:

    @Override
public void m() {

    if(this.au() && this.getGoalTarget() != null && this.vehicle instanceof EntityChicken) {
        ((EntityInsentient) this.vehicle).getNavigation().a(this.getNavigation().j(), 1.5D);
    }

    try {
        ((EntityMonster) this.getClass().getSuperclass().getSuperclass().getConstructor(World.class).newInstance(this.world)).m();
    }catch(InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e){
        e.printStackTrace();
    }

}

2 个答案:

答案 0 :(得分:2)

如果你不能使用继承,那么你应该给decorator pattern一个机会。

在动机部分:

  

...有时(例如,使用外部框架)修改基类是不可能的,合法的或方便的。

在您的情况下,您可以使用装饰器模式向C类(继承自B的类)添加功能:

class A {
    public void m() {
        System.out.println("A");
    }
}

class B extends A {
    public void m() {
        System.out.println("B");
    }
}

class C extends B {

    private final A base;

    public C(A base) { // pass other needed arguments
        this.base = base;
    }

    public void m() {
        this.base.m(); // instead of super.m()
        System.out.println("C");
    }
}

您需要按如下方式实例化C

A base = new A();
C c = new C(base);

然后:

c.m();

哪个应该打印:

A
C

答案 1 :(得分:0)

你想以这种方式打电话吗?

public class C {

    public void m() throws IllegalAccessException, InstantiationException {
        System.out.println("C");
    }
}

public class B extends C {
    @Override
    public void m() throws IllegalAccessException, InstantiationException {
        super.m();
        System.out.println("B");
    }
}

public class A extends B {
    @Override
    public void m() throws IllegalAccessException, InstantiationException {
        ((C) this.getClass().getSuperclass().getSuperclass().newInstance()).m();
        System.out.println("A");
    }
}