---------------------------------------------------------------
APIE
---------------------------------------------------------------
抽象: Abstraction
多态: Polymorphism
继承: Inheritance
封装: Encapsulation
---------------------------------------------------------------
抽象
---------------------------------------------------------------
从“书桌, 餐桌, 电脑桌”中【剥离】出桌子的概念, 是一个排除表象,寻找共同的本质特性的过程。
抽象也是一个把需求中的实体【模型化】的过程。
---------------------------------------------------------------
封装
---------------------------------------------------------------
隐藏一个类中需要隐藏起来的属性和行为,只暴露必要的东西。这个过程就是封装。
隐藏的意义不在【保密】, 而在减少类之间的【依赖】,这样在类增多后,才能知道【改变】一个类时,会影响到哪些类,不会影响哪些类。
封装另一个好处是【隐藏细节】,提供了【更高层次的抽象】,这样就减轻了代码使用者的脑力负担。 一层一层的封装更容易构建一个复杂系统。
在OC中,利用.h和.m文件来区分开公开和隐藏的信息,使用property来控制访问。
---------------------------------------------------------------
继承
---------------------------------------------------------------
继承是isA(是一个)关系,
组合(Composition)是hasA(有一个)关系。
提到【继承】就离不开【组合】。
组合用代码表示, 就是把另一个类当做自己的一个变量,来访问它的接口。
而继承的代码实质是,“复制”了所有另一个类的方法和变量(除了private的)、接口和实现,并有权重写方法,增加自己需要的东西。
从代码角度上来看, 继承会让两个类的【耦合度非常高】,而组合则【松散】得多。
坊间的说法有“优先使用组合胜过使用继承”
但并非要走极端到“永远使用组合”
总之,最好【谨慎】地使用继承
如果是代码需要【复用】,两个类没有isA关系,那一定要用【组合】,即使需要复用的是全部代码。
原因是,即使暂时上,这种情况下,组合和继承在使用者角度上没有差别,都能达到目的。
但差别在于【以后】,也就是代码的【走向 】- 不论是任何一个类改变,都有很大风险导致另一个类不适应,因为他们之间没有概念上的isA关系。而有了概念上的isA关系,未来的风险会小的多。
用继承时要考虑到,子类是否可以完全替代父类,也就是说要检查项目中【任何】用到父类的地方,都可以用子类来替换。并且,在父类增加或修改了方法后,子类不会受到本质上的【影响】。
除了代码复用外,另一个好处就是下面要说到的【多态】
---------------------------------------------------------------
多态
---------------------------------------------------------------
多态字面上的意思是:多种形态(different forms)
他的概念很简单:【不同的类可以使用同名的方法】。
也就是说如果有这样的类结构:
![图片](http://b399.photo.store.qq.com/psb?/V119tlAw1T0pbk/Q9fOx5gUauHXOyfxF7kIrUlUQLVzciKAunRKc3dDGJ0!/b/dFXb2.1pEQAA&bo=PAHdAAAAAAABAMc!&su=0175705361&rf=2-9)
利用继承的重写(overriding)功能来自定义各自的work(),
那么即使员工(Employee)有几十种类型(子类),只要用父类调用work方法,
这些子类就在runtime时自动寻找各自的work实现。
这个强大的功能就是一种多态。