实现多态的两类三种方法

一个很拗口的标题,主要是想表达的想法很多,但又没有一个合适的专用名词来形容,于是就起么个名字。我会给出思维导向图,希望读者能从记住本文的主题。

UML图1

UML图2

Bingo,好了,我把今天要讲的主旨都放这三个图里了,大家请深刻体会一下,实现多态时我们应该用哪种方式?作为程序员,大家都知道一个好的设计是要把“做什么”和“怎么做”分开,但怎么去分开,是需要做一些思考的。如图中所述,当我们发现主(操作)类与具体(实现)类之间是的“is a”的关系时,其是指具体类是主类的一个子类,两者之间存在逻辑上的继承(父子)关系,我们不妨采用继承的方式来实现程序的多态;而当主(操作)类与具体(实现)类之间是仅仅是“can do”的关系,亦即主类只是想让具体类帮忙做一件或几件的事话,就大可不必使用继承关系,而应该把这一件或几件的事抽象成接口,让主类去聚合这个接口,具体类呢去实现这个接口就可以啦。图中的例子正好可以说明我的讲述,“舞台”类与“演员”类之间就是“can do”关系,两者之间并无逻辑上的父子关系,使用合成关系实现多态是最好的方式。大家可能疑惑于为什么不使用继承的方式,好吧,我我同时也用继承的方式实现这个看戏的过程,请大家看一下UMl图1,其中的“国王演员”类中有两个方法并不是他应该的去实现的方法:“对镜贴花黄”,“花园荡秋千”这两个方法。哈哈,这两个方法本来是王后演员的动作的,但由于采用的继承的方式,所有演员方法都被抽象到“演员”的抽象类中去啦,于是呢,我们就看到一个很坏很坏的场景(设计):一个满脸大胡子的英武男人对着镜子抹口红梳头发哈!嗯,不知大家明白我的意思没,好好体会一下吧,我这里“道”一下,不可尽言不可言尽,哈哈!但我想我已经说的很清楚,大家只是需要用自己的方式来把这个答案描述下来就是了。总之,现代设计模式告诉我们,我们在实现程序的多态时,请尽量使用合成的方式实现多态,而不是使用继承的方式哈。这样我们就会避免看到一个大老爷们在秋千扭捏做态的样子啦!
示例

Enjoy!


posted @ 2009-10-01 17:28  bigdog  阅读(1878)  评论(0编辑  收藏  举报