Parent可以调用Child Class方法吗?

Kev*_*oyd 22 java inheritance

在这里提到

A是预编译的Java类(我也有源文件)B是我正在创作的
B类扩展A.

如何实现逻辑,以便A可以调用B具有的方法.
以下是条件:

  • 我不想触摸A(仅作为最后一个选项,但如果不存在其他解决方案).
  • 我不想使用反射.

如上所述,如果需要,我可以修改A.无论哪种方式,可能的解决方案是什么?

Ale*_*lli 45

A应该定义它要调用的方法(可能是抽象的,A应该是一个抽象类,根据Paul Haahr的优秀指南); B可以(事实上,如果方法是抽象的,必须是具体的)覆盖这些方法.现在,A当在B类实例中发生时,从其他方法调用这些方法将转到B的覆盖.

整体设计模式称为模板方法 ; 要重写的方法通常称为"钩子方法",执行调用的方法称为"组织方法".

  • 依赖注入(搜索它!)可以通过多种方式实现(有自动化的框架,以及许多手动方法),但它确实归结为A持有对接口I的私有引用(否则,它会在哪里调用I '方法? - ).因为你热衷于使用B(扩展A)实现I(打破设计模式前两个原则:程序到接口,而不是实现;更喜欢组合到继承),要么A在我的构造函数中采用B调用,或者`setTheI` setter(B的构造函数可以用`this`作为参数调用). (2认同)

Tim*_*mmm 15

是的,它看来,如果你重写超/基类的函数,调用这些函数基类中必去的孩子/派生类.在我看来,这似乎是一个糟糕的设计,但你去了.

class Base
{
    public void foo()
    {
        doStuff();
    }
    public void doStuff()
    {
        print("base");
    }
}

class Derived extends Base
{
    @Override
    public void doStuff()
    {
        print("derived");
    }
}

new Derived().foo(); // Prints "derived".
Run Code Online (Sandbox Code Playgroud)

显然所有Derived的方法都必须已经定义Base,但是否则(没有内省)这样做在逻辑上是不可能的.

  • 谷歌在AsyncTask中实现了这个确切的结构,Base类是抽象的.我无法理解它的糟糕设计 (6认同)