黑马程序员--Object-C--03--继承、多态

来源:互联网 发布:java初学书籍 编辑:程序博客网 时间:2024/04/29 16:48

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

一、继承

1、@private 私有成员是不能被继承,也不能被外部函数访问。
2、@public 公有成员能被继承,也能被外部函数访问。
3、@protected 保护成员能够被继承,不能够被外部函数访问。

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。

父类

子类

函数的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法。不会引起冲突。从父类继承的方法,不适用于子类时,可以直接声明父类的同名函数,并定义。不用考虑父类中,函数已存在的问题。重写后,子类就不能调用父类的方法。

继承有两缺点:

(1)当层级越来越多时,假如每个层级都有实例变量,那么最下层的子类继承的实例变量会超级多,沉重;

(2)当消息传递自子类往上时,层级越多,效率越低下。

所以就有了组合。两者是“A is B"关系则是继承,两者是"A has B"则是组合。

二、多态

举个例子,创建Pc父类与LenovePc、DellPc两个子类。

Pc.h

Pc.m
LenovePc.h
LenovePc.m
DellPc.h
DellPc.m
创建Person类实现开机操作
Person.h
Person.m
main.m

如果不用多态机制实现的话(Person.h中注释的代码部分),就需要给两种Pc分别定义开机的方法,然后在Person.m(代码中注释的部分)中对每个Pc开机方法进行实现,同时在main.m文件中,我们看到,当Person需要使用Pc的时候,就去调用对应Pc指定的方法(main.m中的28、30行):
[person powerWithLenove: (LenovePc *)lenove]
[person powerWithDell: (DellPc *)dell]
如果此时又有了惠普、苹果等等不同的Pc,就需要在Person中扩充开机方法,从而使得Person中的方法臃肿累赘,所以这时候多态就体现到好处了,使用父类类型,在Person.h中定义一个方法就可以了:
- (void) doPower(Pc *)pc;
. 这个方法的参数类型就是父类的类型,这就是多态,定义类型为父类类型,实际类型为子类类型。调用方法
person调用doPower方法,实参看起来是Pc类型,但调用方法的时候会动态监测其真实类型,即LenovePc、DellPc,从而根据真实类型,如果是子类的话就会调用子类的对应方法。



0 0