面向对象:组合与继承
关于继承:你想要一根香蕉,但得到的却是一只拿着香蕉的大猩猩,甚至还有整个森林
标签:笔记
关于继承:你想要一根香蕉,但得到的却是一只拿着香蕉的大猩猩,甚至还有整个森林
使用继承有很多优点,父类的大部分功能可以通过继承关系自动进入子类;修改或扩展继承而来的属性和方法较为容易。那么,如何判断两个类之间是否有继承关系呢?很简单,用”是”来判断。比如:马是动物。那么马继承于动物。玫瑰是植物。那么玫瑰继承于植物。骂人的时候,我们会说:你是畜牲,那么这个人继承于畜牲,象畜牲一样没有人性。你是猪,那么这个人继承于猪,象猪一样愚笨。这就是所谓的”is-a”。
但是,继承同样有很多缺点。人类在大千世界中,不断的认识世界,也不断的改造世界。人类曾经梦想,在天空中飞翔。那么,人类如何飞行呢?鸟可以飞行,那是因为鸟有翅膀这个特征,才会拥有飞这个行为。如果人类继承于鸟类,象鸟一样长出翅膀,那么也就可以有飞行的行为了。
荀子在《劝学》中,有这样的一段话:”假舆马者,非利足也,而致千里;假舟楫者,非能水也,而绝江河。君子生非异也,善假于物也。”就是说,人可以骑马,即使这个人跑得不快,也可以到达千里之外。人可以坐船,即使这个人不会游泳,也可以到达江河的任何位置。君子其实没什么太多特别的地方,只不过善于利用工具而已。这就是所谓的”has-a”。拥有什么,或者使用什么。
这样的解决方案,其实就是告诉我们,与其我们”是什么”,倒不如我们”用什么”。也就是用聚合/组合复用,去代替继承复用。把一些特征和行为抽取出来,形成工具类。然后通过聚合/组合成为当前类的属性。再调用其中的属性和行为达到代码重用的目的。
换句话说,用”has-a”(有什么或用什么)去替代”is-a”(是什么)。