一.封装
当定义了一个类时,类中的数据不允许外界访问,或者允许外界只能读取不能修改而需要隐藏时,就需要用到 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;
} |
|