【问题标题】:Call 'grand' parent function from child class in multi-level inheritance [duplicate]从多级继承中的子类调用“大”父函数[重复]
【发布时间】:2013-02-26 08:18:06
【问题描述】:
public class GrandParent
{
    public void walk()
    {
        ...
    }
}

public class Parent
{
    public void walk()
    {
        ...
    }
}

public class Child
{
    public void walk()
    {
        // Here in some cases I want to use walk method of GrandParent class
    }
}

现在在 Child.walk() 中,我只想在某些情况下使用 GrandParent.walk()。我怎样才能做到这一点?由于 super.walk() 将始终使用 Parent.walk()。

注意:(请注意,这是一个复杂场景的简化示例)

注意 2: 请仅说明是否有执行此操作的标准程序。我在父类中使用了一个标志,如果孩子想使用 GrandParent 的方法,则设置该标志。但是这个序列变得非常复杂。

【问题讨论】:

  • 将您在Child 中使用的相同逻辑也放入Parent
  • 你不能将子实例转换为祖父类型并调用 walk 吗?
  • 顺便说一句,您可能想知道您正在通过尝试从 Child 访问 GrandParent 功能来破坏封装。只是一个“好的设计”点,但我觉得它是相关的。有关更多信息,请参阅stackoverflow.com/questions/586363/…
  • @0xCAFEBABE 调用该方法最具体的实现。将孩子强制转换为祖父母不会改变最具体实现的可用性。
  • 这个术语让我有点困惑,我习惯于在描述对象树时听到 walkparent 一起使用,而不是类继承。

标签: java inheritance superclass


【解决方案1】:

这里的问题在于决定调用父函数“walk”。它不应该被称为“walk”,除非它旨在完全替代 GrandParent walk()

如果该决定无法更改,那么@zvzdhk 现有答案中建议的解决方案是可以做到的最佳解决方案。

理想情况下,Parent walk() 将被赋予一个新名称,以反映其功能与 GrandParent walk() 的任何不同之处。然后可以从 Child 类调用每个函数。

【讨论】:

    【解决方案2】:

    您可以像这样指定访问父级值的方法:

    public class GrandParent
    {
        public void walk()
        {
            ...
        }
    }
    
    public class Parent
    {
        public void walk()
        {
            ...
        }
    
        public void grandParentWalk()
        {
            super.walk();
        }
    }
    
    public class Child
    {
        public void walk()
        {
            grandParentWalk();
        }
    }
    

    类似问题:

    【讨论】:

    • 再一次,对于很多这样的方法,事情会变得复杂。
    • 不打破鸡蛋就无法打破 OOP 原则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2021-06-19
    • 2019-08-26
    • 2012-04-11
    • 2020-02-09
    相关资源
    最近更新 更多