Java 生成重写的方法';s super指的是超级类s super
我知道这个标题听起来有点奇怪,但这正是我愿意做的。简单解释如下:Java 生成重写的方法';s super指的是超级类s super,java,inheritance,bukkit,Java,Inheritance,Bukkit,我知道这个标题听起来有点奇怪,但这正是我愿意做的。简单解释如下: A类是B类的一个子类,B类也是C类的一个子类 现在,所有这些类都包含方法m()。在我的A类中,我唯一可以访问的类,因为其他类只能在运行时使用,我重写B类的m()方法。 然而,B类的m()方法包含对它自己的超类(即C)的m()方法的调用,尽管我对它做了一些修改,但最终还是不得不调用该方法 我已经搜索了一段时间,我听说在类似的情况下这是不可能的,因为它会“破坏封装”,我真的理解为什么。然而,在我的例子中,我是在一个重写的方法中完成这一
A类
是B类
的一个子类,B类
也是C类
的一个子类
现在,所有这些类都包含方法m()
。在我的A
类中,我唯一可以访问的类,因为其他类只能在运行时使用,我重写B
类的m()
方法。
然而,B
类的m()
方法包含对它自己的超类(即C
)的m()
方法的调用,尽管我对它做了一些修改,但最终还是不得不调用该方法
我已经搜索了一段时间,我听说在类似的情况下这是不可能的,因为它会“破坏封装”,我真的理解为什么。然而,在我的例子中,我是在一个重写的方法中完成这一切的,那么有什么方法可以让它以这种方式工作呢?谢谢
编辑:
啊,我想我没有解释清楚。我只是在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();
}
}
你想这样称呼它吗
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");
}
}
如果你不能使用继承,那么你应该给他们一个机会 在动机部分: …有时(例如,使用外部框架)修改基类是不可能的、不合法的或不方便的 在您的例子中,可以使用decorator模式向
C
类(从B
继承的类)添加功能:
您需要实例化C
,如下所示:
A base = new A();
C c = new C(base);
然后:
c.m();
其中应打印:
A
C
您说过您的类B方法已经调用了超级(C)方法。你还想要什么?这听起来有点混乱,所以
a扩展了C
,这就足够了;类B
中的方法m()
类似于super.m()
——它调用类C
的方法m()
——我不明白你说的问题是什么?即使重写基类(C.m()
)的一个方法,也没有什么能阻止您使用子类(classB
)中的super.m()
调用该方法。我只是在C类中重写B类中的方法。从这里开始,在我的C类方法中,我需要调用的m()方法不是B类的(它适用于super.m()),而是C类的。您有一个C
基类,它由B
扩展,最后您有一个a
扩展B
。从一般到特殊,C->B->A
。但是,在编辑中,您说您正在重写C
中的方法m()
,这没有意义,因为它是基类。请澄清。@Federicoperaltachaffner不,我是说,从C类开始,我覆盖了B类中的m()方法。嗯,让我想想,我现在会检查它是否有效,但是的,这是我理论上想做的。不过,使用反射从来都不难。啊,不幸的是,它在我的情况下不起作用。我得到一个实例化异常:您支持默认构造函数吗?否则您可能需要使用激活器。正如你们在我最后的评论中所看到的,我没有使用任何参数构造函数,但我自己编辑了它。这仍然会引发异常…不幸的是,我不能这样做。也许我第一次应该解释得更好。。。我使用的是Bukkit,实际上我要做的是创建一个自定义实体,以替换默认实体。虽然默认类仍然存在,但我告诉Bukkit只使用我的类而不是那个类。另外,我的类继承了默认类的所有行为,但它为它添加了一些东西。无论如何,问题是,我不是实例化我的类的人,Bukkit是。它只能用默认僵尸类(world)的普通参数来实例化它。。。
A
C