我知道标题听起来可能有点怪,但这正是我愿意做的。简单解释一下:Class A
是class 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