面向对象的APIE

---------------------------------------------------------------
APIE
--------------------------------------------------------------- 

抽象: Abstraction
多态: Polymorphism
继承: Inheritance
封装: Encapsulation

---------------------------------------------------------------
抽象
---------------------------------------------------------------

从“书桌, 餐桌, 电脑桌”中【剥离】出桌子的概念, 是一个排除表象,寻找共同的本质特性的过程。

抽象也是一个把需求中的实体【模型化】的过程。

---------------------------------------------------------------
封装
--------------------------------------------------------------- 

隐藏一个类中需要隐藏起来的属性和行为,只暴露必要的东西。这个过程就是封装。

隐藏的意义不在【保密】, 而在减少类之间的【依赖】,这样在类增多后,才能知道【改变】一个类时,会影响到哪些类,不会影响哪些类。

封装另一个好处是【隐藏细节】,提供了【更高层次的抽象】,这样就减轻了代码使用者的脑力负担。 一层一层的封装更容易构建一个复杂系统。

在OC中,利用.h和.m文件来区分开公开和隐藏的信息,使用property来控制访问。

---------------------------------------------------------------
继承
---------------------------------------------------------------  

继承是isA(是一个)关系,
组合(Composition)是hasA(有一个)关系。
提到【继承】就离不开【组合】。

组合用代码表示, 就是把另一个类当做自己的一个变量,来访问它的接口。
而继承的代码实质是,“复制”了所有另一个类的方法和变量(除了private的)、接口和实现,并有权重写方法,增加自己需要的东西。
从代码角度上来看, 继承会让两个类的【耦合度非常高】,而组合则【松散】得多。

坊间的说法有“优先使用组合胜过使用继承”
但并非要走极端到“永远使用组合”
总之,最好【谨慎】地使用继承

如果是代码需要【复用】,两个类没有isA关系,那一定要用【组合】,即使需要复用的是全部代码。
原因是,即使暂时上,这种情况下,组合和继承在使用者角度上没有差别,都能达到目的。
但差别在于【以后】,也就是代码的【走向 】- 不论是任何一个类改变,都有很大风险导致另一个类不适应,因为他们之间没有概念上的isA关系。而有了概念上的isA关系,未来的风险会小的多。

用继承时要考虑到,子类是否可以完全替代父类,也就是说要检查项目中【任何】用到父类的地方,都可以用子类来替换。并且,在父类增加或修改了方法后,子类不会受到本质上的【影响】。

除了代码复用外,另一个好处就是下面要说到的【多态】

---------------------------------------------------------------
多态
---------------------------------------------------------------   

多态字面上的意思是:多种形态(different forms)

他的概念很简单:【不同的类可以使用同名的方法】。

也就是说如果有这样的类结构:

图片

利用继承的重写(overriding)功能来自定义各自的work(),
那么即使员工(Employee)有几十种类型(子类),只要用父类调用work方法,
这些子类就在runtime时自动寻找各自的work实现。

这个强大的功能就是一种多态。 

 

posted @ 2013-12-19 05:43  darrendev  阅读(294)  评论(0编辑  收藏  举报