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

现在,所有这些类都包含方法m()。在我的A类中,我可以访问的唯一一个类,因为其他类仅在运行时可用,所以我覆盖了B类的m()方法。
但是,m()类的B方法包含对其自身超类(即m())的C方法的调用,尽管我对其进行了一些修改,但最终我还是必须调用该方法。

我搜索了一段时间,听说在类似情况下这是不可能的,因为它会“破坏封装”,我真的很明白为什么。但是,就我而言,我是在一个重写的方法中完成所有操作,所以我有什么实际方法可以使它如此工作?谢谢!

编辑:
嗯,我想我没有很好地解释安静。我只是从C类中的B类覆盖方法。从那里开始,在C类的方法内部,我需要调用不是B类的m()方法(该方法适用于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();
    }

}

最佳答案

如果您不能使用继承,则应该给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

07-24 09:38
查看更多