首页 > 代码库 > oc语言--面向对象的三大特性
oc语言--面向对象的三大特性
一、封装
1.什么是封装
在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
1> set方法
① 作用:提供一个方法给外界设置成员变量值,实现对参数的相应过滤
② 命名规范
*方法名必须以set开头
*set后面跟上成员变量的名称,成员变量名首字母必须大写
*返回值一定是void
*一定要接收一个参数,而且参数类型跟成员变量类型一致
*形参的名称不能跟成员变量名一样
1 #import <Foundation.foundation.h> 2 3 @interface Student : NSObject : NSObject //声明一个类 4 { 5 int _age;//设置一个成员变量 6 } 7 8 - (void)study;//声明一个study对象方法 9 - (void)setAge:(int)age;//声明set方法10 11 @end12 13 14 15 @implementation Student //对声明的方法进行实现16 17 - (void)setAge:(int)age //set方法的实现18 {19 if(age <= 0) //对不合理的值进行过滤20 {21 age = 1;22 }23 24 _age = age;25 }26 27 - (void)study //study方法的实现28 {29 NSLog("%d岁的学生在学习",age);30 }31 32 @end33 34 int main()35 {36 Student *stu = [Student new];//新建一个Student类型对象37 [stu setAge :10];//调用set方法进行赋值操作38 [stu study];// 对象调用对象方法39 return 0;40 }
2> get方法
①作用:返回成员变量值
②命名规范
*有返回值,返回值类型与成员变量类型相同
*方法名跟成员变量名相同
*不需要接收任何参数
1 #import <Foundation.foundation.h> 2 3 @interface Student : NSObject //声明一个类 4 { 5 int _age;//设置一个成员变量 6 } 7 8 - (void)study;//声明一个对象方法 9 - (void)setAge:(int)age;//声明set方法10 - (int)age;//声明get方法11 12 @end13 14 15 16 @implementation Student //对声明的方法进行实现17 18 - (void)setAge:(int)age //set方法的实现19 {20 if(age <= 0) //对不合理的值进行过滤21 {22 age = 1;23 }24 25 _age = age;26 }27 28 - (int)age // get方法的实现29 {30 return _age;31 }32 33 - (void)study //study方法的实现34 {35 NSLog("%d岁的学生在学习",[stu age]);//get方法的调用36 }37 38 @end39 40 int main()41 {42 Student *stu = [Student new];//新建一个Student类型对象43 [stu setAge :10];//调用set方法进行赋值操作44 [stu study];// 对象调用对象方法45 return 0;46 }
3> 封装细节
①成员变量名以_开头,命名规范
*作用1,让成员变量名与get方法名区分开
*作用2,跟局部变量名分开,带_一般就是成员变量名
1 #import <Foundation.Foundation.h> 2 3 @interface Score : NSObject //声明Score类 4 { 5 int _cScore;//设置成员变量 _cScore 6 int _ocScore;//设置成员变量 _ocScore 7 int _totalScore;//设置成员变量 _totalScore 8 int _averageScore;//设置成员变量 _averageScore 9 }10 11 - (void)setCScore:(int)cScore;//声明set方法12 - (int)cScore;//声明get方法13 14 - (void)setOcScore:(int)ocScore;//声明set方法15 - (int)ocScore;//声明get方法16 17 - (int)totalScore;//声明get方法18 - (int)averageScore;//声明get方法19 20 @end21 22 23 @implementation Score //方法的实现24 25 - (void)setCScore:(int)cScore //set方法的实现26 {27 _cScore = cScore;28 _totalScore = _cScore + _ocScore;//计算总分,监听成员变量的改变29 _averageScore = _totalScore/2;//计算平均分30 }31 32 - (int)cScore // get方法的实现33 {34 return _cScore;35 }36 37 38 - (void)setOcScore:(int)ocScore //set方法的实现39 {40 _ocScore = ocScore;41 _totalScore = _cScore + _ocScore; //计算总分,监听成员变量的改变42 _averageScore = _totalScore/2;//计算平均分43 }44 45 - (int)ocScore // get方法的实现46 {47 return _ocScore;48 }49 50 51 - (int)totalScore // get方法的实现52 {53 return _totalScore;54 }55 - (int)averageScore // get方法的实现56 {57 return _averageScore ;58 }59 60 @end61 62 int main()63 {64 Score *sc = [Score new];65 66 int t = [sc _totalScore];67 int a = [sc _averageScore];68 69 NSLog("总分是%d,平均分是%d",t, a);70 71 return 0;72 }
4> 封装的好处
*过滤不合理的值
*屏蔽内部的赋值过程
*让外部不必关注内部细节
二、继承
1.继承
通过继承,子类可以拥有父类中所有的成员变量和方法
1 #import <Foundation.Foundation.h> 2 3 4 @interface Animal : NSObject //声明一个Animal类,并且继承了NSObject 5 { 6 int _age; // 声明了两个成员变量 7 double _weight; 8 } 9 - (void)setAge:(int)age; //声明set方法10 - (void)setWeight:(double)weight;11 - int)age; //声明get方法12 - (double)weight;13 - (void)run;14 15 16 @implementation Animal //类的实现17 - (void)setAge:(int)age //set方法的实现18 {19 _age = age;20 }21 22 - (void)setWeight:(double)weight//set方法的实现23 {24 _weight = weight;25 }26 27 - int)age //get方法的实现28 {29 return _age;30 }31 32 - (double)weight //get方法的实现33 {34 return _weight;35 }36 37 - (void)run38 {39 NSLog(@"动物跑了起来");40 }41 @end42 43 44 45 46 47 @interface Dog : Animal //Dog继承了Animal里面所有的成员变量和方法48 49 50 @end51 52 53 @implementation Dog54 55 @end56 57 int main()58 {59 Dog *d = [Dog new];60 [d setAge:8];61 [d setWeight:20.0];62 NSLog(@"%岁的狗,%d公斤",[d age], [d weight]);63 64 return 0;65 }
2.重写
子类重新实现父类中某个方法,覆盖父类以前的做法
1 #import <Foundation.Foundation.h> 2 3 4 @interface Animal : NSObject //声明一个Animal类,并且继承了NSObject 5 { 6 int _age; // 声明了两个成员变量 7 double _weight; 8 } 9 - (void)setAge:(int)age; //声明set方法10 - (void)setWeight:(double)weight;11 - int)age; //声明get方法12 - (double)weight;13 - (void)run;14 15 16 @implementation Animal //类的实现17 - (void)setAge:(int)age //set方法的实现18 {19 _age = age;20 }21 22 - (void)setWeight:(double)weight//set方法的实现23 {24 _weight = weight;25 }26 27 - int)age //get方法的实现28 {29 return _age;30 }31 32 - (double)weight //get方法的实现33 {34 return _weight;35 }36 37 - (void)run38 {39 NSLog(@"动物跑了起来");40 }41 @end42 43 44 45 46 47 @interface Dog : Animal //Dog继承了Animal里面所有的成员变量和方法48 49 - (void)run;50 @end51 52 53 @implementation Dog54 - (void)run //重写父类run方法55 {56 NSLog(@"%岁,%d公斤的狗跑了起来",[d age], [d weight]); 57 }58 59 @end60 61 int main()62 {63 Dog *d = [Dog new];64 [d setAge:8];65 [d setWeight:20.0];66 [d run];67 NSLog(@"%岁的狗,%d公斤",[d age], [d weight]);68 69 return 0;70 }
3.super作用
1> 直接调用父类中的某个方法
2> super处在对象方法中,就调用父类的对象方法;super处在类方法中,就调用父类的类方法
3> 使用场合:子类重写父类方法时,想保留父类方法的一些行为
4.使用注意
1> 父类必须声明在子类前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中寻找,如果找不到,再去父类中寻找
4> oc语言是单继承
5.缺点
*耦合性太强,删除父类后,子类就不能够继续使用
6.好处
* 不改变原来模型的基础上,拓充方法
* 建立了类与类之间的联系
* 抽取了公共代码
7.使用场合
1> 当两个类拥有相同的属性和方法时,就可以将相同的东西抽取出到父类中
2> 当A类中拥有B类的部分属性和方法时,可以考虑让B类继承A类
3> 组合:xxx拥有xx; 继承:xxx是xx
三、多态
1.多态:多种形态
1> 没有继承就没有多态
2> 代码体现:父类类型指针指向子类对象
#import <Foundation.Foundation.h>@interface Animal : NSObject- (void)eat;@end@implementation Animal- (void)eat{ NSlog(@"动物吃东西");}@end@interface Dog : Animal- (void)eat;@end@implementation Dog- (void)eat{ NSlog(@"Dog吃东西");}@endint main(){ //多种形态 Dog *d = [Dog new];// Dog类型 //多态;父类指针指向子类对象 Animal *a = [Dog new]; [a eat];//调用方法时,检测对象的真实类型 rerurn 0;}
2.优缺点
1> 好处:如果函数\方法的参数类型使用的父类类型,可以传入子类和父类对象
2> 局限性:父类类型变量不能够直接调用子类特有的方法(编译过程会有警告)。必须强转为子类类型便后后,才能够直接调用子类特有的方法。
oc语言--面向对象的三大特性