黑马程序猿_OC之三大特性

来源:互联网 发布:java c base64 编辑:程序博客网 时间:2024/06/10 00:14

1.封装

何为封装?封装是不在主方法里随便更改成员变量的值,把更改成员变量的值单独写一个方法出来,每次更改的时候调用这个方法,成为set方法。封装的好处是不让成员变量暴露在外面,随便被人修改,提高数据的安全性,也可以保证输入的变量值是符合逻辑的。而有些数据对于外界来说是只读的,只需要返回一个值,不需要传入一个值,此时可以写成get方法,get方法是为了得到对象的成员变量,只读成员变量则只提供get方法,不提供set方法。

</pre><pre name="code" class="objc">#import <Foundation/Foundation.h>@interface Student:NSObject{     // @public 不能让随便修改值   int age;}- (void)study;//set方法,必须以set开头,set后面跟上成员变量的名称,成员变量的首字母必须大写,返回值一定为void,一定要接收参数,参数类型与成员变量的类型一致,形参的名称不能跟成员变量名一样- (void)setAge:(int)newAge;//get方法,返回对象内部的成员变量,肯定有返回值,返回值类型与成员变量类型一致,方法名与成员变量名一样,不需要接收任何参数- (int)age;@end@implementation- (void)study{   NSLog(@"%d岁的学生在学习",age);}- (void)setAge:(int)newAge{ //对传进来的参数进行过滤 if(newAge <= 0){  newAge = 1;}  age = newAge;}- (int)age{return age;}@endint main(){   Student *s = [Student new];    [s setAge:10]   [s study];   [s age];   return 0 ;}
此外,为了区分成员变量、set方法的参数、get方法的名称,OC中的成员变量一定要以下划线_开头,上面那段代码修正后为:

@interface Student:NSObject

{

int  _age;

}

- (void)study;

- (void)setAge:(int)age;

- (int)age;

@end

下面贴一段自己练手的代码:

#import <Foundation/Foundation.h>@interface Score:NSObject{double _c;double _oc;double _average;double _sum;}- (void)setC:(double)c;- (double)c;- (void)setOc:(double)oc;- (double)oc;- (double)average;- (double)sum;@end@implementation Score- (void)setC:(double)c{  _c = c;}- (double)c{   return _c;}- (void)setOc:(double)oc{  _oc = oc;}- (double)oc{   return _oc;}- (double)average   {   return (_c + _oc)/2;}- (double)sum{    return _c + _oc;}@end
这个是老师要讲的一个题目,我自己之前写了一遍,发现自己写的时候最容易出错的就是命名不规范,成员变量名跟方法名都不准确,咋一看不知道是什么意思,所以写名称的时候一定不能懒,最好把意思写全了。

2.继承

继承就是抽取重复代码,建立类之间的关系, 子类可以拥有父类中的所有成员变量跟方法,而基本上所有类的根类都是NSObject,这也是我们最开始的时候为什么声明类的时候都要加:NSObject

#import<Foundation/Foundation.h>@interface Person:NSObject               //父类必须声明在子类前面{int _age;}- (void)setAge:(int)age;- (int)age;- (void)run;                         //父类可以只声明方法,留给子类去实现方法,+ (void)test;@end@implementation Person- (void)setAge:(int)age{ _age = age;}- (int)age{   return _age;}- (void)run{  NSLog(@"人跑!");}+ (void)test{NSLog(@"人test");}@end                                //不允许子类和父类拥有相同名称的成员变量,但是允许拥有相同名称的方法,@interface Teacher:Person  @end@implementation Teacher- (void) run                    //重写:子类重新实现父类中的某个方法,覆盖父类方法以前的做法{NSLog(@"老师跑!");}+ (void)test{NSLog(@"老师test");}int main(){Teacher *t = [Teacher new];[t run];[Person test];return 0;}

3.多态

多态是指对象的多种形态,只有继承才有多态的概念,因为多态的语法体现是父类指针指向子类对象。

#import <Foundation/Foundation.h>@interface Animal:NSObject- (void)eat;@end@implementation Animan- (void)eat{ NSLog(@"Animal吃东西");}@end@interface Dog:Animal@end@implementation Dog   - (void)eat     //重写{ NSLog(@"Dog吃东西");}@end@interface Cat:Animal@end@implementation Cat- (void)eat     //重写{ NSLog(@"Cat吃东西");}@endint main(){   Dog *d = [Dog new];   Animal *a = [Dog new];   Animal *c = [Cat new];   [a eat];    //狗吃东西,调用方法的时候会动态检测对象的真实形态   [c eat];    //猫吃东西   return 0;}





0 0
原创粉丝点击