Java 父类可以调用子类方法吗?

Java 父类可以调用子类方法吗?,java,inheritance,Java,Inheritance,提及 A是一个预编译的Java类(我还有源文件) B是我正在编写的Java类 B扩展A 如何实现逻辑,使A可以调用B拥有的方法。 以下是条件: 我不想碰A(只是作为一个 最后一个选项是如果否 存在其他解决方案) 我不想使用反射 如前所述,如果需要,我可以修改A。 无论哪种方式,可能的解决方案是什么?ClassA应该定义它要调用的方法(可能是抽象的方法,根据paulhaahr的优秀描述,A应该是抽象类)B可以(实际上是具体的,如果方法是抽象的,则必须)覆盖这些方法。现在,当在类B的实例中发生时

提及

A是一个预编译的Java类(我还有源文件) B是我正在编写的Java类
B扩展A

如何实现逻辑,使A可以调用B拥有的方法。
以下是条件:

  • 我不想碰A(只是作为一个 最后一个选项是如果否 存在其他解决方案)
  • 我不想使用反射
如前所述,如果需要,我可以修改A。
无论哪种方式,可能的解决方案是什么?

Class
A
应该定义它要调用的方法(可能是抽象的方法,根据paulhaahr的优秀描述,A应该是抽象类)
B
可以(实际上是具体的,如果方法是抽象的,则必须)覆盖这些方法。现在,当在类B的实例中发生时,从
A
中的其他方法调用这些方法,转到B的重写


整体设计模式称为;要重写的方法通常称为“hook方法”,执行调用的方法称为“organization方法”。

。如果我错了,请纠正我,然后我将删除,但听起来您希望维护A对象和B对象。如果它们确实不是同一个对象,那么您必须执行的“捆绑”(这是一个科学术语)将非常难看。

是的,似乎如果您重写超级/基类的函数,基类中对这些函数的调用将转到子/派生类。在我看来,这似乎是一个糟糕的设计,但你看

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".

显然,
派生的
的所有方法都必须在
中定义,否则(没有内省)在逻辑上是不可能的。

@Alex Class A是某种库类,而不是抽象类。使用我正在扩展的库A。在这种情况下我该怎么办?@unknown,很高兴你喜欢它!-)@Kevin,如果它是一个库类,那么它就不能明智地了解应用程序级类——这是依赖关系箭头的错误方向!查找依赖项反转:创建一个接口(完全可以依赖抽象的东西,比如接口),并让您的应用程序类实现它,使用依赖项注入为库类实例提供它需要调用的接口实现。顺便说一句,如果图书馆提供了具体的类,但又要求您对它们进行扩展,那么它的设计是可疑的:将Haahr的文章发送给图书馆的架构师!-)@Alex:我理解了第一部分,即B实现接口I,什么是依赖注入?那么,A不需要持有I的引用来调用B的方法吗?我应该在类a中插入一个字段private interface I吗?依赖注入(搜索它!)可以以多种方式实现(有一些框架可以自动实现它,还有许多手动方法),但它确实可以归结为持有对接口I的私有引用(否则,它将在哪里调用I'd方法?-)。当您热衷于让B(它扩展了A)实现I(打破了设计模式的前两个原则:编程到接口,而不是实现;更喜欢组合而不是继承)时,要么在B调用的构造函数中使用take I,要么使用
setTheI
setter(哪个B的构造器可以用
这个
作为参数调用)。很抱歉,我不理解这个问题,请你重新措辞好吗?@kevin Boyd请检查Alex Martelli对其答案的第二条评论(长评论)他指出了我想说的同样的事情。谷歌在AsyncTask实现了这个精确的结构,基类是抽象的。我无法理解它的坏设计如何不能记住我的精确想法,但是我想我在哀叹java中所有的方法都是默认的。C++中,你必须声明一个方法。可以在派生类中重写(而在Java中,您必须使用
final
)显式阻止它)。也许,“看起来是一个糟糕的设计”-对我来说似乎是明智的默认行为:通常您重写方法,因为您希望调用重写版本。(不确定基类是否有方法显式调用自己的方法,而不是子类中的任何重写方法。)这并没有回答问题。问题是,“父类可以调用子类方法吗?”。您已经展示了子类可以调用父方法。不,我还没有…
Base.foo
清楚地调用了
派生的.doStuff