接口继承 - 双继承问题

时间:2014-04-04 23:10:50

标签: design-patterns

我需要使用第一张图片中给出的名称和方法定义4个接口。 Pic 1

但是,我需要保持以下关系:

  • LivingBeingMutable"是" LivingBeingConst
  • AnimalConst"是" LivingBeingConst
  • AnimalMutable"是" LivingBeingConst
  • AnimalMutable"是" LivingBeingMutable
  • AnimalMutable"是" AnimalConst

所以,我用继承修改了接口,如下所示: Pic2

但问题是,AnimalMutable得到了两个" GetLifeSpan()"方法(一个来自AnimalConst,另一个来自LivingBeingMutable)。谁能让我知道设计它的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

这是一个着名的多重继承问题,称为“钻石问题”#34;。

您需要诸如虚拟基类之类的概念 - "虚拟继承" (C ++)。

有关详细信息,请查看此处:

http://www.learncpp.com/cpp-tutorial/117-multiple-inheritance/

http://www.learncpp.com/cpp-tutorial/118-virtual-base-classes/

您可以尝试使用单继承,因为使用单继承也可以完成多重继承的概念,并且有许多广泛使用的OOP语言仅支持单继承。

其他语言不支持纯多重继承,但提供了替代机制来获得多重继承的一些好处,并避免出现此类问题。 Java中的接口就是这样一种机制,因为您只需定义签名方法,并且实现始终是实现它们的类的责任,尽管类可以实现许多接口。

答案 1 :(得分:0)

多重继承在接口

中是安全的

这可能是c ++中的钻石问题。

如果您正在使用Java / C#(从您提及的界面猜测),您应该没有任何问题。

发明界面是为了解决钻石问题。

代替方法原型,如果你有一个成员变量被继承,那么“它来自哪里”的问题就会有意义。

因为它只是方法的原型(无论如何都是一样的),如果从多个接口继承相同的方法并不重要。所以你可以安全地创建这些接口而没有任何问题。 / p>

希望这有帮助。