我知道标题可能听起来有点奇怪,但这正是我愿意做的。简单解释:
Class A
是class 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();
}
}
答案 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");
}
}