A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mazhichao 中级黑马   /  2015-7-3 17:54  /  506 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多态的条件
        有继承关系,有方法重写,父类声明变量指向子类对象
多态的概念
        不同的对象以自己的方式响应父类的同名方法
体现:用父类类型的指针指向子类对象,如下多态性
        狗 *g = [狗 new];
        动物 * a= [狗 new];

        猫 *c = [猫 new];
        动物 * a= [猫 new];

多态的优点
        多态的主要好处就是简化了编程接口,容许类和类之间重用一些习惯性的命名,
多态的实现
        父类Animal.h
        #import<Foundation/Foundation.h>
        //声明父类对象
        @interface Animal :NSObect
        -(void)run;
        @end
        父类Animal.m
        #import”Animal.h”
        //实现父类对象
        @implementation Animal
        -(void)run
        {
                NSLog(@“动物在跑”);
        }
        @end


        子类狗类Dog.h
        #import<Foundation/Foundation.h>
        #import”Animal.h”
        //声明狗类对象
        @interface Dog :Animal

        -(void)run;                //此话可写可不写,因为父类有
        -(void)eat;

        @end
        子类Dog.m
        #import”Dog.h”
        //实现子类对象
        @implementation Dog
        -(void)run
        {
                NSLog(@“狗在跑”);
        }
        -(void)eat
        {
                NSLog(@“狗在吃东西”);
        }
        @end

        子类猫类Dog.h
        #import<Foundation/Foundation.h>
        #import”Animal.h”
        //声明狗类对象
        @interface Cat :Animal

        -(void)run;                //此话可写可不写,因为父类有

        @end
        子类Cat.m
        #import”Cat.h”
        //实现子类对象
        @implementation Cat
        -(void)run
        {
                NSLog(@“猫在跑”);
        }
        @end
       
        测试main函数
        #import <Foundation/Foundation.h>
        #import”DOg.h”
        #import “Cat.h”
        int main(int argc,const char * argv[])
        {
                @autoreleasepool{
                //*******不使用多态的形式*******
                        Animal *ani = [Animal new];
                        [ani run];                        //动物在跑
                       
                        Dog *d = [Dog new];
                        [d run];                        //狗在跑

                        Cat *c = [Cat new];
                        [c run];                        //猫在跑

                //*******使用多态的形式*******
                //父类指针指向了子类的对象
                        Animal *a2 = [Dog new];
                        [a2 run];
                }
        }
多态原理
        动态绑定:及动态类型能使程序知道执行时才确定对象所属类型
                        动态类型绑定能使程序知道执行时才确定要对对象调用的实际方法,
                        Animal *a2 = [Dog new];//执行到这句话的时候才能确定是调用的事Dog类
                        [a2 run];
多态的注意点
        1)如果存在多态,父类是可以访问子类特有的方法
       
                Animal *a2 = [Dog new];                //a2属于Animal类型,指向Dog对象,a2没有eat方法
                        [a2 eat];(编译的时候会报错)
                [(Dog *)a2 eat];                        //狗在吃东西,可以将a2强制转化为Dog类型
        2)如果不存在堕胎,父类事不可以访问子类特有方法的

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马