”等我准备好了再说“, ”等我都准备好了再上班“,“”等我准备好了再结婚 “等我准备好“ 是永远不存在的状态,再怎么等 也没办法”准备好的“;-----蔡康永
面向对象的三大特征:封装、继承、多态。
封装
封装:客观世界中对象的成员变量(用于描述对象的状态数据)都被隐藏在对象内部,外界无法直接操作和修改, 入一个对象的年龄,只能随着年月更迭而变化,一般不允许直接修改 对一个类或对象实现良好的封装。()
OC提供了4个访问控制符: @private @package @protected @public 分别代表的4个访问控制级别。
@private 只允许在当前类中访问
@protected 允许在当前类和子类中访问
@package 当前类和同一个映像中
@public 默认为public 可以在任意地方访问
继承
提到继承,就得提到其根类, 没有父类的类位于类层次的最顶层,称为根类(root)在OC中允许建立自己的根类, 但通常不这么做,而是希望利用现有的类, 目前我们所定义的类都是属于NSObject 根类的派生类。
继承一般体现在接口部分, 如栗子所示, ClassA继承了NSObject的任何方法和实例变量。
@interface ClassA: NSObject
{
int x;
}
-(void) initVar;
@end
若再建诸如继承于ClassA 的子类ClassB, 则又继承了ClassA.(我们常通过继承来扩展:添加新方法)
如之前一片博文提到的Rectangle类, 现假设你将使用正方形 Square; 则可以通过Square继承Rectangle类做到, 因为正方形是矩形的子类,也是它长宽相等的特例;
我们给出Squere的实现文件。
#import "Square.h"
@implementation Square
-(void) setSide: (int )n
{
[self setWidth:n andHeight:n];
}
-(int )side
{
return self.width;
}
@end
setSide: 方法利用了一个事实,即你从 Rectangle类继承了一个方法来设置矩形的宽度和高度,因此 setSide:方法会调用Rectangle类的setWidth:n andHeight:n
方法来传递参数,
我们可以通过覆写来更改继承方法的定义。
假设我们拥有一台打印机, 可以打印不同的颜色。通过覆写print就可以输出不同的颜色;
那么就可以提出多态概念了;
多态
Oc中的多态:不同对象对同一消息的不同响应.子类可以重写父类的方法
多态就是允许方法重名 参数或返回值可以是父类型传入或返回。
栗子: Fraction和Complex类都包含 print方法, 那么 ,在执行消息表达式:
[myFraction print];和[myComplex print]; 时,系统如何知道执行哪个方法呢?
答案是:OC编译器运行时知道消息的接受者是个什么类型的对象,那么 将会调用该类的方法
系统总是携带有关于“一个对象属于哪个类”这样的信息,该信息能使系统在运行时做出这样的决定,而不是在编译时。