一.封装 当定义了一个类时,类中的数据不允许外界访问,或者允许外界只能读取不能修改而需要隐藏时,就需要用到 set方法或者get方法。 1.写方法(setter) - 给成员变量赋值OC中的规范: (1)一定没有返回值 (2)一定是对象方法(-) (3)方法名一定是以set开头 格式:set + 去掉下划线的成员变量名的首字母大写 (4)一定有参数,参数的类型一定是和成员变量类型一致 (5)形参的名称一般建议是 去掉下划线的成员变量名 (6)写方法的实现中,一定是给成员变量赋值 2.读方法(getter) - 读取成员变量的值 规范: (1)一定是一个对象方法 (2)一定有返回值 (3)方法名一定是 去掉下划线的 成员变量名 (4)一定没有参数 (5)方法的实现中:一定是返回值成员变量名 例如:
#import @interface Dog:NSObject { int _speed; } //声明成员变量 -(void)setSpeed:(int)speed; //声明setter方法 -(int)speed; //声明getter方法 -(void)run; //声明run方法 @end @implementation Dog -(void)setSpeed:(int)speed{ //实现setter方法 _speed=speed; } -(int)speed{ //实现getter方法 return_speed; } -(void)run{ //实现run方法 NSLog(@"狗正在以%d码的速度奔跑。",[selfspeed]); } //打印的时候调用了 getter 方法 @end int main(int argc, constchar * argv[]) { @autoreleasepool { Dog *dog=[Dognew]; //实例化一个Dog 对象 [dog setSpeed:230]; //调用setter方法给成员变量赋值 [dog run]; //调用 run 方法 } return0; } 程序运行结果:狗正在以230码的速度奔跑。
二、继承 继承的标识为英文的“:”冒号,使用继承可以定义一个具有父类所有功能(成员和方法)的新类,它继承了父类的功能。 为何要使用继承? 将所有重复的内容合并在一起,可以使代码有效率,简洁,才意味着是一个成功的架构。否则,修改代码时需要修改多处,就很容易出错。 1.继承的根类 大多都继承自 NSObject 类,所以在定义一个类时,要继承NSObject 类。 2.使用注意 (1)先有父类才有子类 (2)许子类中不能有和父类中相同名称的成员变量 (3)子类的实例化对象 可以调用弗雷的方法 (4)子类可以重写父类方法,当调用子类时优先调用子类方法 例如: @interface bigYellowDog : Dog //父类为Dog -(void)eat; //子类中定义一个吃的方法 @end @implementation bigYellowDog (void)eat{ NSLog("大黄狗正在吃东西"); } //实现子类中eat 的方法 @end int main(int argc, constchar * argv[]) { @autoreleasepool { bigYellowDog *byd=[bigYellowDognew]; //实例化一个bigYellow 对象 [byd setSpeed:250]; //调用父类的setter方法给成员变量赋值 [byd run]; //调用父类的 run 方法 } return0; } 程序运行结果:狗正在以250码的速度奔跑。 从程序的运行结果看出,Dog 的子类确实继承了 Dog类中所定义的 成员变量 以及方法的声明及实现
三、多态 多态的条件: 有继承关系、有方法重写(如果没有方法的重写可以用强制转换的方式) 父类的声明变量指向子类对象。 1.多态的表现形式: 父类指针指向了子类对象 2.多态的好处 多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用 为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现 接口的类的区分开来 例如: #import @interface Dog:NSObject -(void)run; //父类声明run方法 @end @implementation Dog -(void)run{ //父类实现run方法
NSLog(@"小黑狗狗正在以300码的速度奔跑。"); } @end @interface bigYellowDog : Dog //继承父类Dog @end @implementation bigYellowDog -(void)run{ //重写父类run方法 NSLog(@"大黄狗,跑不动了。。。"); } @end int main(int argc, constchar * argv[]) { @autoreleasepool { Dog *dog=[bigYellowDognew]; //使父类指针指向子类对象 [dog run]; //父类对象调用run方法 } return0; } 程序运行结果:大黄狗,跑不动了。。。 从程序运行结果可以看出父类的指针确实是调用了子类的方法。
|