0

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

我有一个主类 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 的设备。类设备有很多属性。Type1 和 Type2 有自己的属性,它们继承自 Equipment。Type1 和 Type2 都有电缆。有一个具有特定属性的电缆类。此外,Type1 和 Type2 有不同类型的电缆,CableType1 CableType2,它们有自己的特定属性,并从 Type1 或 Type2 继承字段。

4

2 回答 2

3

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

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

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

于 2013-03-20T19:41:24.780 回答
1

正如有人已经提到的,.NET 不支持多重继承。话虽如此,一个类可以实现多个接口,或者一个接口可以继承多个接口,这与扩展方法一起提供了一种很好的共享实现方式。这不像多继承那样类似于mixin,但效果大致相同。

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

对于封装,您可以使用显式接口实现在实现类上实现某些属性,以便在使用类本身时某些属性不可见。

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

于 2013-03-20T20:10:09.980 回答