您的位置:首页 > 职场人生

黑马程序员-类的封装,继承和多态

2015-07-11 17:52 489 查看

------ <a
href="http://www.itheima.com" target="blank">
Java培训、Android培训、iOS培训、.Net培训</a> 期待与您交流! -------

封装

为什么要进行封装?

不封装的缺点:

    当一个类把自己的属性暴露给外部的时候,那么该类就失去对属性的管理权

将数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不可被外部任意存储是面向对象设计本质。降低了数据被无用的可能性!

    在OC语言中,使用@interface和@implementation来处理类。

    @interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。

封装的原理?

   
实例变量默认只能被当前类的对象方法访问。

封装的概念?

   
给类中每个实例变量提供设置值和获取值的方法

封装的步骤

    定义设置实例变量(setter)方法和访问实例变量(getter)的方法

1)setter方法(设置器)

    在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可以对一些不合理的赋值进行筛选过滤。

Set方法的作用:为外界提供一个设置成员变量值的方法,以后对实例变量设置值,一律使用此方法。
命名规范:

(1)方法名必须以Set开头

(2)Set后面跟上成员变量的名称,首字母大写

(3)没有返回值

(4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致

(5)形参名不能和成员变量名一样(苹果官方推荐成员变量名前加_以示区分)

(6)Set是一个对象方法

Set方法的好处:

(1)不让数据暴露在外,保证了数据的安全性

(2)对设置的数据进行过滤

2)getter方法(访问器)

Get方法的作用:为调用者返回对象内部的成员变量

命名规范:

(1)一定有返回值,返回值是实例变量的值,返回值的类型和实例变量的类型一致

(2)方法名为成员变量名去掉下划线

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

(4)get方法一定是对象方法

继承

注:

   
1)基类的私有属性能被继承,不能被使用。

    2)OC中的继承是单继承:也就是说一个类只能一个父类,不能继承多个父类,但是可以支持多层继承

    3)继承的合理性: 引用一句话来述继承:

继承的关系如下图:



基类和派生类之间的关系



方法的重写

     
方法的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。

@interfaceAnimal
: NSObject

{

int_tuiNum; //退的个数

int_eyeNum; //眼睛个数

}

-(void)setTuiNum:(int)tuiNum;

-(void)setEyeNum:(int)eyeNum;

-(int)tuiNum;

-(int)eyeNum;

-(void)eat;

-(void)run;

#import "Animal.h"

@interfaceDog : Animal

{

}

-(void)eat;//覆盖父类的eat的方法

@end

   
重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法,不会引起冲突。子类可以通过super调用父类的方法。

从父类继承的方法,不适用于子类时,可以直接声明父类的同名方法,并定义。不用考虑父类中,方法已存在的问题。

继承体系中方法调用的顺序

1)在自己类中找

2)如果没有,去父类中找

3)如果父类中没有,就去父类的父类中

4)如果父类的父类也没有,就还往上找,直到找到基类(NSObject)

5)如果NSObject也没有就报错了

多态

     程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态

多态的条件

1)多态的条件:有继承关系、有方法重写

2)父类的声明变量指向子类对象。

3)用父类类型的指针指向了子类对象,这就是多态。如:

动物类是父类,狗类和猫类是子类。

狗*g = [狗 new];

动物*a = [狗 new];  

猫*c = [猫 new];

动物*a = [猫 new];

多态的优点

    多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。

    多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。

多态的原理

动态绑定:

    动态类型能使程序直到执行时才确定对象所属类型

    动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法

    OC不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载

    id类型:通用指针类型,弱类型,编译时不进行类型检查

多态的注意点

1)如果存在多态,父类是可以访问子类特有的方法

假设子类Dog 有一个特有的方法bark

[dog bark];

Animal *an2 = [Dog new];

[(Dog*)an2 bark]; //把父类的指针,强制类型转换

2)如果不存在多态,父类是不可以访问子类特有的方法的

Animal *an3 = [Animal new];

[(Dog*)an3 bark];//错误的,不能强制转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息