黑马程序员---第五篇 OC三大特性

来源:互联网 发布:学霸专用解锁软件 编辑:程序博客网 时间:2024/05/02 02:41

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、封装(即成员变量的封装)

1、好处: 过滤不合理的值;屏蔽内部的赋值过程;让外界不必关注内部的细节。

2、使用set方法:

(1)作用:提供一个方法给外界设置成员变量值

(2)命名规范:

 1)方法名必须以set开头。

 2)方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写。

 3)返回值一定是void。

 4)形参名称不要跟成员变量同名。

 5)一定接收一个参数,而且跟成员变量类型一致。

3、用set进行封装的实例:

#import <Foundation/Foundation.h>

@interface Student : NSObject

{

    int age;

}

- (void) setAge:(int) newAge;//注意:的使用

- (void) Study;//声明

@end

@implementation Student

//set方法的实现

- (void) setAge:(int) newAge

{

   //对传进来的参数进行过滤

   if(newAge<=0)

    {

       newAge=1;

    }

   age=newAge;

}

- (void) Study  //方法

{

   NSLog(@"%d岁的学生在学习",age);

}

@end

int main(int argc, const char * argv[])

{

   Student *stu=[Student new];//oc中的变量都是用指针指向的,不要忘记*

    //去掉public时这样调用函数

   [stu setAge:-10];//输出结果:1岁的学生在学习

   [stu Study];

    //当输入“-10”是会输出结果:-10岁的学生在学习.不符合逻辑规则,所以引出了封装的概念

   return 0;

}

4、get方法进行封装

(1)作用:返回对象内部的成员变量。

(2)命名规范:

1)有返回值,与成员变量类型一致。

2)方法名跟成员变量名一样。

3)不需要接收任何参数。

3)实例:(在set方法进行封装的基础上改写)

#import <Foundation/Foundation.h>

@interface Student : NSObject

{

   int age;

}

- (void) setAge:(int) newAge;//注意:的使用

- (void) Study;//声明

@end

 

@implementation Student

//set方法的实现

- (void) setAge:(int) newAge

{       //对传进来的参数进行过滤

   if(newAge<=0)

    {

       newAge=1;

    }

   age=newAge;

}

//get方法进行封装

-(int) age;

{

   return  age;

}

- (void) Study  //方法

{

   NSLog(@"%d岁的学生在学习",age);

}

@end

 

int main(int argc, const char * argv[])

{

   Student *stu=[Student new];//oc中的变量都是用指针指向的,不要忘记*

   [stu setAge:0];

   NSLog(@"学生的年龄是%d岁",[stu age]);//输出结果:学生的年龄是1岁

   return 0;

}

二、继承(最重要的特性)

1、好处:

1>不改变原来模型的基础上,拓充方法。

2>  建立了类与类之间的联系。

3> 抽取了公共代码。

4> 坏处:耦合性强。

2、使用场合

1>  它的所有属性都是你想要的,一般就继承。

2>它的部分属性是你想要的,可以抽取出另一个父类。

实例:从Dog与Cat中抽象出Animal类

#import <Foundation/Foundation.h>

//DogCat继承Animal

/**********Animal************/

@interface Animal : NSObject

{

    int _age;  //Animal 的年龄

    double _weight;  //Animal的体重

}

-(void) setAge:(int) age;

-(int) age;

-(void) setWeight:(double) weight;

-(double) weight;

@end

 

@implementation Animal

-(void) setAge:(int) age;

{

    _age=age;

}

-(int) age;

{

    return _age;

}

-(void) setWeight:(double) weight;

{

    _weight=weight;

}

-(double) weight;

{

    return _weight;

}

@end

/********Dog*******/

//AnimalDgeCat的父类

@interface Dog:Animal  //继承Animal,即拥有Animal所有的成员变量和方法

@end  

@implementation Dog

@end

 

/**********Cat**********/

@interface Cat : Animal   //继承Animal,即拥有Animal所有的成员变量和方法

@end

@implementation Cat

@end

int main(int argc,const char * argv[])

{

    Dog *d=[Dognew];

    [d setAge:10];

    NSLog(@"age=%d",[dage]);//输出结果:age=10

    return 0;

}

三、多态

1、基本概念:

OC的多态性指的是对象的多种形态。

2、多态的体现

   Person*p = [Student new];

   p->age= 100;

   [pwalk];

子类对象赋值给父类指针。

父类指针访问对应的属性和方法。

3、多态的好处:

用父类接收参数,节省代码。

4、多态的局限性

不能访问子类的属性(但是可以考虑强制转换)。

5、多态的细节

动态绑定:在运行时根据对象的类型确定动态调用的方法。

6、实例:

#import <Foundation/Foundation.h>

//多态(对象的多态性)

@interface Animal : NSObject

-(void) eat;

@end

 

@implementation Animal

-(void)eat

{

    NSLog(@"Animal:吃点东西!");

}

@end

 

@interface Dog : Animal

@end

 

@implementation Dog

-(void)eat

{

    NSLog(@"Dog在吃东西!");

}

@end

 

int main(int argc,const char * argv[])

{

    //多种形态

    //Dog *d=[Dog new];//Dog类型

    //多态:父类指针指向子类对象

    Animal *a=[Dognew];

    //注意:Dog *a=[Animal new];(是不合适的,虽然不会报错,但是会出现警告,同时也不符合逻辑)

     //调用方法时会检测对象的真实类型

    [a eat];   //输出结果:Dog在吃东西!

    return 0;

}

 

 

 

 

0 0