【发布时间】:2016-05-29 20:59:11
【问题描述】:
我知道这个标题可能听起来有点奇怪,但这正是我愿意做的。简单解释:
Class A 是class B 的子类,class B 也是class C 的子类。
现在,所有这些类都包含方法m()。在我的A 类中,我唯一可以访问的类,因为其他类仅在运行时可用,所以我覆盖了B 类的m() 方法。
但是,B 类的 m() 方法包含对其自身超类(即C)的m() 方法的调用,尽管我对其进行了一些修改,但我最终也不得不调用那个方法。
我搜索了一段时间,听说在类似情况下这是不可能的,因为它会“破坏封装”,我真的明白为什么。但是,就我而言,我是在一个被覆盖的方法中完成这一切的,所以有什么方法可以让我真正做到这一点,让它以这种方式工作吗?谢谢!
编辑: 啊,我想我没有很好地解释安静。我只是在我的 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();
}
}
【问题讨论】:
-
你说你的B类方法已经调用了超级(C)方法。你还想要什么?
-
这听起来有点令人困惑,所以
A extends B扩展了C- 足够了;并且m()类B中的方法super.m()有类似super.m()的东西 - 它调用C类的方法m()- 我不明白你说什么问题出在哪里?即使您重写了基类 (C.m()) 的方法,也没有什么能阻止您使用子类(B)中的super.m()调用该方法。 -
啊,我想我没有很好地解释安静。我只是在我的 C 类中覆盖 B 类的方法。从那里,在我的 C 类方法中,我需要调用不是 B 类的 m() 方法(这适用于 super.m()),而是 C 类。
-
您的编辑似乎自相矛盾。你有一个
C基类,它由B扩展,最后你有一个A扩展B。从一般到特殊,C -> B -> A。但是,在您的编辑中,您说您正在覆盖C中的方法m(),这没有意义,因为它是基类。请澄清。 -
@FedericoPeraltaSchaffner 不,我是说,从 C 类开始,我正在重写 B 类中的 m() 方法。
标签: java inheritance bukkit