您的位置:首页 > 编程语言 > C语言/C++

OC语言--类的三大特性

2014-12-23 10:31 183 查看
类的三大特性:封装、继承、多态

一、封装:

1. 为什么封装?

1>安全性:成员变量对类来说很重要,如果外部人员可以随意的修改成员变量的值,那这样对程序来说是不安全的,且有的变量不希望外部人员修改,比如:入学时间,入学时间是一个固定值,一般程序希望的是外部人员可以只读此变量,不可修改变量;

2>过滤数据:成员变量的数值有一定的要求,如果外部人员对变量赋值的时候不在要求之内,则需要对数值进行过滤,例如:对年龄赋值,如果输入负数,则需要对数值进行操作;

2. Set方法和get方法:

set方法

1.作用: 让外界对成员变量赋值,在赋值的过程中对变量数值进行过滤

2.命名规范:

1> 方法名必须以set开头

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

3> 返回值一定是void

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

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

示例:-(void)setAge:(int)newAge;

get方法

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

2.命名规范:

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

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

3> 不需要接收任何参数

成员变量名的命名规范:一定要以下划线 _ 开头

作用:

1.让成员变量和get方法的名称区分开

2.可以跟局部变量区分

示例:

@interface Student : NSObject

{

int _no;   //下划线开头

Sex _sex;

}

- (void)setNo:(int)no;    //set方法

- (int)no;                      //get方法

- (void)setSex:(Sex)sex;

- (Sex)sex;

@end

3. 类方法

1. 对象方法

* 减号 - 开头
* 只能由对象来调用
* 对象方法中能访问当前对象的成员变量(实例变量)

2.类方法

* 加号 + 开头
* 只能由类(名)来调用
* 类方法中不能访问成员变量(实例变量)

3.类方法的好处和使用场合

*不依赖于对象,执行效率高
* 能用类方法,尽量用类方法
* 场合:当方法内部不需要使用到成员变量时,就可以改为类方法,例如计算器类

4.类方法和对象方法可以同名
5.类方法注意:

*类方法中不能访问实例变量;
*工具类可以应用类方法;
*类方法中可以调用另一个类方法;
*死循环

示例:
+ (void)test

{

//[Person test];  //死循环

//int a = _age;   //类方法中不能访问实例变量

[self  test2];    //类方法可以调用另一个类方法

}


4. Self

self的用途:

1> 谁调用了当前方法,self就代表谁

2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量

- (void)test

{

NSLog(@”%d”,self->_age);

}

3> [self 方法名]可以调用其他对象方法\类方法

、、死循环:

+ (void)test

{

[self  test];

}

- (void)test

{

[self  test];

}

二、继承

1.为什么要继承?

因为有些类中的属性和另一类中的属性相同,如果一个个的写,代码重复性太多,所以可以讲两者的共同属性和行为抽取出来创建一个父类,这样再定义其他类的时候只要继承父类则就会自动拥有父类中的属性和行为。

2.继承的好处:

1>抽取重复代码

2> 建立了类之间的关系

3> 子类可以拥有父类中的所有成员变量和方法

3. 坏处:耦合性太强

4.注意

1> 父类必须声明在子类的前面

2> 子类不能拥有和父类相同的成员变量

3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找

4> 子类重新实现父类中的某个方法,覆盖父类以前的做法

5.继承的使用场合

1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中,例如Dog和Cat都有int _age属性,- (void)run方法,所以可以抽取出Animal父类;

2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类

A

{

int _age;

int _no;

}

B :A

{

int _weight;

}

// 继承:xx 是 xxx,同类的可以继承

// 组合:xxx 拥有 xxx     不同类的可以组合
3>组合
A

{

int _age;

int _no;

}

B

{

A *_a;

int _weight;

}

5. super

super的作用

1.直接调用父类中的某个方法,[super run]

2.super处在对象方法中,那么就会调用父类的对象方法

super处在类方法中,那么就会调用父类的类方法

3.使用场合:子类重写父类的方法时想保留父类的一些行为

Super和self的使用方法有很多相似的地方,只是self是用于调用当前类的行为,super是调用当前类的父类的行为或方法。

示例:

@implementation Dog

- (void)eat

{

[supereat]

NSLog(@"Dog类调用Animal类中的- (void)eat方法");

}

+ (void)eat

{

[supereat]

NSLog(@"Dog类调用Animal类中的+ (void)eat方法");

}

@end

三、多态

多态的应用示例:

//Animal.m
void feed(Animal *a)

{
[aeat];
}

int main()
{
<pre name="code" class="objc">       Animal *aa = [Dog new];
[aa feed]
Dog *dd = (Dog *)aa;
[dd run];

NSObject *n = [Dog new];

NSObject *n2 = [Animal new];

// 多种形态

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

// 多态:父类指针指向子类对象
Animal *a = [Dog new];

// 调用方法时会检测对象的真实形象
[a eat];
}


多态注意:

1> 父类类型的变量不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法

2>多态,就是多种形态,如果定义变量都为父类类型,则形参为父类类型的函数子类都可以调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: