面向对象的特性:多态

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



  多态

/*

 类和类之间的关系

 多种形态,没有继承就没有多态

 

 对象和对象的关系

 1> 组合    2> 依赖     3> 关联

 

 多态: 不同对象以自己的方式,响应同名的方法

 

 

多态的条件:

 

 1> 存在继承关系

 

 2> 存在方法重写(一定会存在同名方法(父类和子类之间一定有同名方法))

 

 3> 父类指针指向子类对象

 

 

 好处: 如果函数\方法参数中使用的是父类类型,可以传入父类和子类对象

 

 局限性

 1> 父类类型的变量不能直接调用子类特有的方法,必须强转为子类类型变量后,才能调用子类特有的方法

 */


#import <Foundation/Foundation.h>


//Animal类的声明

@interface Animal : NSObject

- (void)eat;

@end

@implementation Animal

- (void)eat

{

    NSLog(@"Animal 吃东西");

}

@end


@interface Dog : Animal

@end

@implementation Dog

//重写

- (void)eat

{

    NSLog(@"Dog 吃东西");

}

@end


@interface Cat : Animal

@end

@implementation Cat

- (void)eat

{

    NSLog(@"Cat 吃东西");

}

@end


//如果参数中使用的是父类类型,可以传入父类和子类对象

void feed(Animal *a){

    [a eat];

}

int main(int argc, const char * argv[]) {

    //父类指针指向子类对象

//    NSObject *n = [Dog new];

//    NSObject *n = [Animal new];

   //多种形态  Dog类型

    Dog *d = [Dog new];

    Cat *c = [Cat new];

    Animal *a = [Animal new];

    

    //多态:父类指针指向子类对象

    

    Animal *a1 = [Dog new];

    

    //调用方法时会动态检测对象的真实形象

    [a1 eat];

    

    feed(a);

    feed(d);

    feed(c);

    

    //多态的局限性: 父类类型的变量不能用来调用子类的方法

    Animal *aa = [Dog new];

    //强制转换  aa转为Dog *类型的变量

//    Dog *dd = (Dog *)aa;

//    [dd eat];

//    [aa run];

    [(Dog *)aa eat];

    

    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值