多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。
当使用多态方式调用方法时:
首先检查父类中是否有该方法,如果没有,则编译错误;如果有,则检查子类是否覆盖了该方法。
如果子类覆盖了该方法,就调用子类的方法,否则调用父类方法。
从上面的例子可以看出,多态的一个好处是:当子类比较多时,也不需要定义多个变量,可以只定义一个父类类型的变量来引用不同子类的实例。
以上信息来源:http://www.oschina.net/code/snippet_1172389_47643
同样在JAVA中有一些逻辑(资料来自:http://my.oschina.net/u/1398304/blog/212003),我觉得可以通用到OC,总结如下:
1:为什么可以将子类实例对象的引用传给父类类型引用呢?
答:多态的体现,鸽子是鸟类,鹦鹉是鸟类,喜鹊是鸟类,它们都是鸟类,这就是鸟类的多种表现形态(多态),它们有鸟类的基本特征与行为,并且还有自己特有的行为,那就会把鸟类的基本特征与行为继承过来给自己。
程序中可以写作 鸟类 *鸟指针名 = [ 鸽子 new];就创建了一个鸟类的引用,它是鸽子,被鸟类引用的鸽子。
类的概念是抽象的,所以它就仅仅是个引用,只有引用到实例对象,它才真正实现了自己(我的理解就是实例化以后才真正有值)。
2:父与子的关系会怎样呢?
假如有Worker类(子类)继承自Person类(父类),所以会先加载Person类并初始化成员变量在Worker类实例对象中。这就是子类继承过来的成员变量(类属性中的内容)。
如果子类中定义了与父类相同的成员变量,变量不会存在重写,子类实例对象中会有两份相同名称的实例变量,调用时,父类的会被隐藏。(父类中的方法不调用,在子类中重写的被使用)
如果想调用父类被隐藏的成员变量,那就要使用super关键字([super 父类对象方法名];)。(只能调到当前类的前一级父类,父类的父类无法调用。)
同样,子类会继承父类的成员方法作为自己的成员方法,如果子类定义了与父类相同的成员方法(重写),多态中会调用子类自己的成员方法。(貌似还是在描述重写……)
3:多态,又有什么好处呢?不一样继承父类的属性方法吗?
首先明确: 继承关系!=多态特性。
不同于 Worker worker = new Worker();的继承,Person worker = new Worker(); 展示了多态的关系,鸽子是鸟类的一种表现形态。//此处是JAVA,本人没有深入了解过,按照描述反推就是子类的指针指向子类,类似继承关系??父类的指针指向子类才有多态表现。
好处:一句话概括:-------------- 提高了程序的扩展性 ----------
弊端:只能使用父类的引用访问父类的成员。