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()
)的一个方法,也没有什么能阻止您使用子类(class
B
)中的
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