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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© machao610 中级黑马   /  2014-5-31 22:15  /  1119 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


多态(多种形态)
#import <Foundation/Foundation.h>
    @interface Animal : NSObject
    - (void)eat;
    @end
   
    @implementation Animal
    - (void)eat
    {
        NSLog(@"Animal-吃东西--");
    }
    @end
   
    @interface Dog : Animal
   
    @end
   
    @implementation Dog
    - (void)eat
    {
        NSLog(@"Dog-吃东西--");
    }
    @end
   
   
   
int main()
{
    Dog *d = [Dog new];
    //多态:父类指针指向子类对象
    Animal *a = [Dog new];
    //调用方法时会检测对象的真实类型
    [a eat]
   
    所以下面的写法都是可以的
    NSObject *n = [Dog new];
    NSObject *n1 = [Animal new];
    return 0;
}


多态
    1.没有继承就没有多态
    2.代码的体现:父类类型的指针指向子类对象
    3.好处:如果函数/方法参数中使用的是父类类型可以传入父类、子类对象
    4.局限性:父类类型的变量不能直接调用子类特有的方法
//这个函数是专门用来喂狗的
//void feed(Dog *d)
//{
//    [d eat]
//}
//
//void feed2(Cat *c)
//{
//    [c eat]
//}
    //上面两种情况是参数中使用父类Animal类型,可以传入父类.子类对象
    void feed(Animal *a)
    {
        [a eat]
    }
   
   
int main()
{
    Animal *aa = [Animal new];
    feed(aa);
    Dog *dd = [Dog new];
    Cat *cc = [Cat new];
    feed(dd);
    feed(cc);
   
    Animal *aa = [Dog new];
    //结果正确,但是不能这么写 此时aa是指向Dog 但是会被认为是Animal
    //[aa run];
   
    //这样是把Animal类型给了Dog类型  是不合理的
    Dog *dd = aa
    //将aa转为Dog *类型的变量
    Dog *dd = (Dog *)aa
    return 0;
}

0 个回复

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