类“ B”扩展“ A”并掩盖其某些功能是否有意义?例如,通过将以下代码放在我们要在A中屏蔽的函数的顶部:

if subclass type is B
  don't execute the function
else
  execute the function


这是否与软件设计中继承的一般思想相矛盾?

最佳答案

正如@rilent在技术上提到的那样,有可能您只是用空的实现覆盖了基本方法。但这是IMO的不良设计。我相信,即使@rilent也同意这一点。

如果不应该让child支持某种特定的行为(例如say方法),则可以/不应该使用parent / super / base类(无论如何)来抽象这种行为。这种抽象将始终导致子类中的方法为空,或者最多它们将引发未实现的异常(这甚至更糟)。

请参见下面的示例,您将了解我要解释的内容。

Bird {
    Mate();
    Fly();
    Swim();
}

Eagle : Bird {
    Mate() { /* :) */ }
    Fly() { /* Oh come on, of course I can. */ }
    Swim() { /* Oops, sorry I can't. */ }
}

Penguin : Bird {
    Mate() { /* :) */ }
    Fly() { /* Sorry I'm a flightless bird. */ }
    Swim() { /* Yeah, I can do this well. */ }
}


现在您明白了为什么我说这是一个糟糕的设计。只是没有意义,对吗?所以,我们能做些什么?

介面

您可以使用接口而不是继承来抽象特定行为。我会重新考虑以上的课程,并有这种东西。 Fly()Swim()分别由ICanFlyICanSwim定义。

Bird {
    Mate();
}

Eagle : Bird, ICanFly {
    Mate() { }
    Fly() { }
}

Penguin : Bird, ICanSwim {
    Mate() { }
    Swim() { }
}


8 birds that can't fly

关于java - 扩展时掩盖父类(super class)功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43748319/

10-10 14:56