gpt4 book ai didi

java - 使重写的方法是 super 引用父类(super class) super

转载 作者:行者123 更新时间:2023-11-30 08:36:59 26 4
gpt4 key购买 nike

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

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

我搜索了一段时间,听说在类似的情况下这是不可能的,因为它会“破坏封装”,我真的明白为什么。但是,就我而言,我是在一个重写的方法中完成这一切的,所以有没有什么办法可以让我真正做到这一点,这样它就可以这样工作了?谢谢!

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

如果它可能有帮助,这是我的实际代码:

    @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一个机会。

在动机部分:

...sometimes (e.g., using external frameworks) it is not possible, legal, or convenient to modify the base class.

在您的情况下,您可以使用装饰器模式向 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

关于java - 使重写的方法是 super 引用父类(super class) super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37509747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com