从父类方法中调用子类方法

8
请考虑以下情况:
class A
{
    X()
    {
        //some code
        Y();
    }
}

class B extends A
{
    Y(){ //some code }
}

如果我创建类 B 的对象,并尝试使用函数 X,因为它是从类 A 扩展的,是否有可能函数 X 可以访问类 B 的调用对象的函数 Y

明显的问题:为什么你想这么做?在我看来,这似乎是一个 XY 问题。 - fge
2
为什么你要那样做呢?在面向对象编程中,让超类调用子类的方法被认为是一种反模式。我认为你可能需要研究一下抽象类及其方法声明。 - Irshu
2个回答

10

你可以这样做,但必须满足以下条件:

  1. 一个类是抽象的
  2. Y方法也是抽象的

示例:

abstract class A {
    void X() {
        Y();
    }

    abstract void Y();
}

class B extends A {
    @Override
    void Y() {
        System.out.println("Hello from B class");
    }
}

每当A类调用Y时,它实际上会调用抽象方法Y的一个已实现的方法。

1
我冒昧地在我的回答中链接了您的回答,因为您已经很好地解释了那个解决方案。如果这是一个问题,请不要犹豫提出 ;) - AxelH
Visual Studio 2022: 在 A 中,Y() 的声明不能是 private,所以需要使用 abstract protected void Y()。然后,在 B 中:移除 @Override,而是使用 override protected void Y() - undefined

0

只有当A具有相同签名的方法(或其超类具有一个)时,它才能找到/使用未在其上下文中定义的方法。

这可以通过以下方式完成

第一种解决方案并不总是最好的,因为您可能会在A中拥有一个什么也不做的方法,例如:

class A{
    void Y(){}
}

注意:如果在两个类中都有Y(),多态性将确保B的实例将使用自己的实现。
第二种解决方案可能会有问题,如果您想能够创建A的实例,因为它将是抽象的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接