我有很长的类继承层次结构。例如:
-MyAbstractObject
--MyAbstractUiObject
---MyAbstractTable
-----MyAbstractPageableTable
-------MyAbstractScrollableTable
---------MyAbstractStateblaTable等等。
我在Code complete上读到,理想的继承深度是3,有时允许将继承深度设置为7-9。但我有深厚的11号遗产!
如何更改我的体系结构?什么设计模式适用于我的案例?糟糕的是,我可以在继承层次结构中更改MyAbstractPageableTable和MyAbstractScrollableTable的位置。这两个类没有混合在一起,因为我的目标是单一的责任。我还想为用户提供不同的接口(API)
发布于 2013-06-19 22:12:21
通常,最好使用策略模式,而不是为每个用例创建一个子类。但很难给出任何艰难的建议,因为这取决于情况。
在您的示例中,我猜您可以做一个Table实现,并为其提供一个策略对象,该对象处理例如分页或该表应该支持的任何其他显示策略。
根据Joshua Bloch的"Effective“,使用组合通常比继承更好。我不认为更大的遗传深度是不好的,只要它们是可以理解的,有11个级别,我猜情况并非如此。
发布于 2013-06-19 22:17:09
构图。您会得到两个较小的继承层次结构:
class MyAbstractObject
class MyAbstractUIObject : MyAbstractObject
class MyAbstractTable : MyAbstractUIObject
interface IMyAbstractTableBehaviour { void Perform(); }
class MyAbstractTablePageableBehaviour : IMyAbstractTableBehaviour
class MyAbstractTableScrollableBehaviour : IMyAbstractTableBehaviour
class MyAbstractTableStateableBehaviour : IMyAbstractTableBehaviour您可以使用这三种行为的任意组合来实例化MyAbstractTable的子类,并且实现额外的行为是微不足道的。
发布于 2013-06-19 22:17:51
我不知道什么是代码完成,但理想的继承可能只是一个正确方向的信号(指导),它并不适用于每种情况(也许你的情况就是其中之一)。UI控件的继承层次结构通常具有此现象,如WPF (Windows Presentation Foundation)中的控件。因此,如果你正在构建一个UI框架,你可能会遇到这个问题。It 依赖于上下文上下文( Context )(您的具体情况),但总体继承增加了代码中的耦合性,正如@Casey所说,如果可能,您应该倾向于组合。
https://stackoverflow.com/questions/17193132
复制相似问题