2012-04-11 87 views
1

我想知道在需要角色或特征的情况下应该做什么,但是在经典的继承环境中。我有两节课,其中两节课都是来自根类,但是我想将两条路上的分开的课程连接在一起,以共享相同的功能。请看下图:古典继承差异

+-- Base 
+-- Base_Processor 
| +-- Base_Processor_Request 
| +-- Base_Processor_Request_Ajax 
+-- Base_Impl 
    +-- Base_Impl_MyImpl 
    +-- Base_Impl_MyImpl_Processor (extends from Base_Processor) 
    +-- Base_Impl_MyImpl_Processor_Request (extends from ??) 
    +-- Base_Impl_MyImpl_Processor_Request_Ajax (extends from ??) 

会是什么,同时还从Base_Impl_MyImpl_Processor延伸到连接Base_Impl_MyImpl_Processor_Request和Base_Processor_Request在一起的最佳方式,并且也以同样的方式链接Base_Impl_MyImpl_Processor_Request_Ajax。

谢谢先进。

+2

更喜欢构成的继承。 – 2012-04-11 18:40:59

回答

2

我同意100%使用Alex Burtsev的评论 - 许多级别的继承看起来像一个依赖性梦魇(而且,正如你发现的,当你使用很多继承时,很难在类之间重用特定的代码段) 。

通常我不希望特性类被插入层次结构 - 在我看来,特性是独立的概念,它定义了实现细节的变化,因此只属于接口而不是从基础派生类

如果这是现有的代码,并且您有多个元素需要在不同的派生类中重复使用,我认为将这些元素分割为与您的层次无关的独立类会更有意义。

看来Processor,RequestAjax可以更好地为您服务作为单独的实体。

+0

所以,纠正我,如果我错了,但你说我应该使那些进入接口,而不是重用Base和Impl中的代码,对吗?但他们都会实现相同的接口。顺便谢谢你的回应! – Kyle 2012-04-12 02:52:02

+0

没关系。找出你的意思[组成与继承](http://www.artima.com/designtechniques/compoinh.html)谢谢! – Kyle 2012-04-12 03:00:28