可选的多重继承.NET

时间:2013-03-20 19:30:26

标签: asp.net vb.net inheritance multiple-inheritance

我正在构建一个相对简单的应用程序,并且对更好的设计实践有点困惑。

我有一个主类MClass。类Child1和Chil2都继承自MClass。现在,还有另一个类AClass,它可以从Child1或Child2继承,但不能同时继承(只有通过,我相信,接口)。

如何从一个或另一个类中获得此可选继承?

还有AChild1和AChild2类,它们都继承自AClass。最终结果如下:

MClass:Child1:ACLASS:AChild1

MClass:CHILD2:ACLASS:AChild2

这是唯一可能的两个选项。简单地将AClass与其子项

结合起来更好

MClass:Child1:AClass1

MClass:CHILD2:AClass2

我可以做到这一点,但AClass1和AClass2会有很多冗余字段......任何推荐?

谢谢!

编辑:

具体情况如下:

我有一件可以是Type1或Type2的装备。 Class Equipment有很多属性。 Type1和Type2有自己的属性,它们继承自Equipment。 Type1和Type2都有电缆。有一类具有特定属性的电缆。此外,Type1和Type2具有不同类型的电缆,CableType1 CableType2,它们具有自己的特定属性并从Type1或Type2继承字段。

2 个答案:

答案 0 :(得分:3)

VB.NET不允许多重继承。根据您的具体用例,您可以执行各种操作:

  • 描述接口中类的通用功能。当然,您仍然需要在所有类中单独实现该功能,它对字段没有帮助,但您可以使用共享接口来访问提供该功能的所有类。
  • 按照建议将功能放在子类中。这是可能的,但意味着一些重复的字段。在某些情况下,这可能没问题,在其他情况下则没有。
  • 将功能放在公共基类 MClass中。这又取决于具体情况
  • 使用合成而不是继承。对多重继承的需求通常表明一个糟糕的类设计,其中继承关系(“是一个”)被滥用,你真的想表达一个组合(“有一个”)。这意味着将字段和/或方法放在两个子节点使用的单独的类中。您应该使用单一责任原则作为指导,以便每个类只有一个明确定义的职责。

不幸的是,你没有给我们一个具体的例子,所以很难说你的情况最好。很可能这些技术的组合将产生最佳结果。

答案 1 :(得分:1)

正如有人已经提到的,.NET不支持多重继承。话虽这么说,类可以实现多个接口,或者接口可以继承多个接口,这与扩展方法一起提供了一种分享实现的好方法。这与多重继承类似,与mixin类似,但效果基本相同。

如果您根据接口重新考虑您的模型,您可以在多重继承方面做您想做的事情。实现类只是POCO,实现逻辑是扩展方法形式的静态方法。

对于封装,您可以使用explicit interface implementation在实现类上实现某些属性,以便在使用类本身时某些属性不可见。

我发现使用这种技术可以提高测试性并防止大量耦合。