1.继承和组合都是可以复用代码。继承is a的关系,组合是has a的关系
2.继承是高耦合的,主要体现就是牵一发动全身。
3.如果想代码复用先考虑使用组合。
4.组合就是被扩展的类拥有一个扩展类的对象。这样拥有类就可以使用这个类的所有方法和属性。扩展类之间如果是需要联络的使用protocol进行。
5.使用继承的场景要满足以下三点:①父类只是给子类提供服务,并不涉及子类的业务逻辑;②层级关系明显,功能划分清晰,父类和子类各做各的;③如果有,父类的所有变化,都需要在子类中体现,这种需求。
6.父类只需要给子类提供一些共用的方法就可以了,不需要放子类的逻辑,比如View继承NSObject
7.当继承超过两层的时候,你就要好好考虑是否使用这个继承方案。第三层继承正是滥用的开始。
8.可以使用代理(delegate)去实现继承的需求,扩展类只要实现协议的方法,被扩展类用代理调用不同扩展类的实现,就可以达到继承效果(苹果推荐)。
9.可以使用类别(category)去实现继承的扩展功能。
10.是使用组合还是继承:要遵循里氏代换原则(有两个类A和B,B是A的子类,那么一个方法如果可以接受一个基类对象a的话:method(a),那么它必然可以接受一个子类对象b,:method(b))。
Casa的例子:
http://casatwy.com/tiao-chu-mian-xiang-dui-xiang-si-xiang-yi-ji-cheng.html
总结:根据里氏代换原则对Casa的例子进行分析:假设在一个Controller中使用到了HOME_SEARCH_BAR,比如addSubView(HOME_SEARCH_BAR)。这里是不能用add(LOCAL_SEARCH_BAR)代换的。因为HOME_SEARCH_BAR与LOCAL_SEARCH_BAR拥有不同的属性与行为,将他们添加到一个view上会得到截然不同的结果。
华丽的分割线,下方是网上摘抄的继承和组合的优缺点,帮助理解。
-----------------------------------------------------------------------------------------
一:继承
继承是Is a的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。
继承的缺点有以下几点:
①:父类的内部细节对子类是可见的。
②:子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。
③:如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想。
二:组合
组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。
组合的优点:
①:当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。
②:当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。
③:当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。
组合的缺点:①:容易产生过多的对象。②:为了能组合多个对象,必须仔细对接口进行定义。
由此可见,组合比继承更具灵活性和稳定性,所以在设计的时候优先使用组合。只有当下列条件满足时才考虑使用继承:
子类是一种特殊的类型,而不只是父类的一个角色
子类的实例不需要变成另一个类的对象
子类扩展,而不是覆盖或者使父类的功能失效