读书人

合成与承继的选用

发布时间: 2012-07-02 17:46:22 作者: rapoo

合成与继承的选用

?

合成和继承的选用。


准备知识:

大部分情况下可以用is-a还是has-a的关系来选用


?


合成与承继的选用

?


继承是is-a 的关系,如上图苹果是水果,梨是水果。但如果实例化后,比如说新建一个苹果,它就不可能又是梨。

?


合成与承继的选用

?

第一种合成关系,组成部分不可共享。一个桌子有几个桌褪和几个桌面,但桌褪或桌面是这个桌子了,就不能再是其它桌子的。

?


合成与承继的选用


第二种合成关系,组成部分可共享。具体的一个学生可以属于一个家庭,但这个学生同时又属于一个学校。


我的发现:

合成是对象间的关系,继承是类之间的关系。



但有时在一些抽象概念上,从逻辑上is-a说的过去,has-a 也说的过去,拿我用过的一个做个例子

?


合成与承继的选用

?

字幕生词为一个电影字幕里不认识的单词,熟词为我认识的单词。

从逻辑上来说一个字幕生词是生词说的过去,熟词是单词也说的过去。但同理说字幕生词包含单词说的过去,熟词是单词也说的过去。汉语确实有些太灵活了。(当然,如果真的用is-a,还是has-a 来仔细分析还是能找到正确答案的,只是有时很容易错)


在分析时,我这样想的,比如一个单词good,它即可以是字幕生词,也可以同时也是熟词,也就是单词的一个实例是要被字幕生词和熟词所共享。这是用继承关系表示不了的。如果我用继承,新建一个good实例,我怎么让它又是字幕生词又是熟词呢?所以应该用合成。

用了合成后又仔细分析,发现其实字幕生词不是单词,因为它是在和一个字幕关联形成的,是包含一个单词。熟词是和用户关联的,也是包含关系,但有时直接分析is-a 还是has-a ,有点绕,通过判断是类间关系还是对象间关系更直接一些。



实例详见 从架构到编码-goodEnglish概要设计


注:本文中的合成指广义的合成,指的是两个对象间的一对一,或一对多及多对多的关系。

?

读书人网 >软件架构设计

热点推荐