黑马程序员-OC对象的三大特性

OC语言是面向对象的语言,其三大特性必不可少。

一、封装是一个很重要的概念,它避免外界直接访问或修改对象的属性,可以过滤不合理的值,让外界不必关心内部的细节。通过set方法来让外部设置成员的属性值,通过get方法来获得对象属性值。

 1 #import <Foundation/Foundation.h>
 2 @interface Student : NSObject</span></span>
 3 {
 4     int  _age;        //以下划线开头,避免和局部变量弄混
 5     int _no; 
 6 }
 7 
 8 - (void)setAge:(int)newAge;    // set方法的声明,函数名和参数用:隔开,返回值一定是void型
 9 - (int)age;                    // get方法的声明
10 - (void)study;
11 @end
12 
13 @implementation Student
14 - (void)setAge:(int)newAge       // set方法的实现</span>
15 {
16    
17     if (newAge <= 0)             // 对传进来的参数进行过滤
18     {
19         newAge = 1;
20     }
21     
22     _age = newAge;
23 }
24 
25 - (int)age                       // get方法的实现</span>
26 {
27     return _age;
28 }
29 - (void)study</span>
30 {
31     NSLog(@"%d岁的学生在学习", _age);
32 }
33 @end
34 
35 int main()
36 {
37     Student *stu = [Student new];
38     [stu setAge:10];                             // 调用对象的set方法
39     NSLog(@"学生的年龄是%d岁", [stu age]);       // 调用函数的get方法
40     [stu study]; 
41      return 0;
42 }

注意事项:

set方法

1.作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤

2.命名规范:

1> 方法名必须以set开头

2> set后面跟上成员变量的名称,成员变量的首字母必须大写

3> 返回值一定是void

4> 一定要接收一个参数,而且参数类型跟成员变量类型一致

5> 形参的名称不能跟成员变量名一样

get方法

1.作用:返回对象内部的成员变量

2.命名规范:

1> 肯定有返回值,返回值类型肯定与成员变量类型一致

2> 方法名跟成员变量名一样

3> 不需要接收任何参数

二、继承可以实现之类与类之间的关系,抽取的公共代码,在原有的基础上扩充了方法。缺点是耦合性太强

继承的使用场合:

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

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

 1 @interface Animal : NSObject
 2 - (void)eat;
 3 @end
 4 
 5 #import <Foundation/Foundation.h>
 6 // Person
 7 @interface Person : NSObject
 8 {
 9     int _age;
10 }
11 
12 - (void)setAge:(int)age;
13 - (int)age;
14 - (void)run;
15 + (void)test;        //类方法,以+号开头
16 @end
17 
18 @implementation Person
19 + (void)test         //类方法实现
20 {
21     NSLog(@"Person+test");
22 }
23 - (void)run
24 {
25     NSLog(@"person---跑");
26 }
27 - (void)setAge:(int)age
28 {
29     _age = age;
30 }
31 - (int)age
32 {
33     return _age;
34 }
35 @end
36 
37 @interface Student : Person      // Student子类
38 {
39     int _no;
40     // int _age;         // 不允许子类和父类拥有相同名称的成员变量
41 }
42 + (void)test2;
43 @end
44 
45 @implementation Student</span>
46 
47 - (void)run            // 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法</span>
48 {
49     NSLog(@"student---跑");
50 }

 

三、多态是把不同的子类当做父类来看,可以屏蔽不同子类之间的差异,写出通用的代码,作出通用的编程,以适应需求的变化。子类对象赋值给父类指针,父类指针来访问对应的属性和方法。

 1 @interface Animal : NSObject
 2 - (void)eat;
 3 @end
 4 
 5 @implementation Animal
 6 - (void)eat
 7 {
 8     NSLog(@"Animal-吃东西----");
 9 }
10 @end
11 
12 @interface Dog : Animal          //狗之类继承动物父类
13 - (void)run;     //增加跑方法
14 @end
15 
16 @implementation  Dog
17 - (void)run
18 {
19     NSLog(@"Dog---跑起来");
20 }
21 - (void)eat                      //重写方法
22 {
23     NSLog(@"Dog-吃东西----");
24 }
25 @end
26 
27 @interface Cat : Animal       //之类猫继承父类动物
28 @end
29 
30 @implementation Cat
31 - (void)eat                    //重写方法
32 {
33     NSLog(@"Cat-吃东西----");
34 }
35 @end
36 
37 int main()</span>
38 {
39    
40     Animal *a = [Dog new];    // 多态:父类指针指向子类对象
41     [a eat];                  // 调用方法时会检测对象的真实形象
42     return 0;
43 }

 

posted on 2014-09-04 14:48  himym2005  阅读(172)  评论(0编辑  收藏  举报

导航