OC多态特性详解

多态在OC中,是面向对象的特性。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。在OC中的本质就是:允许将子类类型的指针赋值给父类类型的指针,再调用父类的方法,这个方法既可以是子类重写过的(会执行子类的方法),也可以是父类方法中传入id类型,从而达到多态的特性。

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

OC中的多态:不同对象对同一消息的不同响应。

这里详细说明两点:

1:父类定义了一个方法后,子类可以重写该方法,使用时,如果把子类的对象赋值给父类类型指针时,那么调用方法时,会响应子类的方法。

2:多态的实现,引入了一个非常重要且常见的数据类型:id类型,这是一个万能指针,它可以指向任意的类型,其本质是一种动态检查类型,编译时并不知道其具体指向了什么类型,那么定义的时候就随意的使用,当然为了防止id指向的对象跟父类不对应或是对象的方法不存在,引入了几种常见的检查函数,实例中会详解。

实例:

 <textarea readonly="readonly" name="code" class="object-c"> 

父类Animal的.h文件:

#import <Cocoa/Cocoa.h>

@interface Animal : NSObject

@property (nonatomic,strong) NSString *name;

-(void)eat:(id)animal;

@end

    父类Animal的.m文件:

#import "Animal.h"

@implementation Animal

-(void)eat:(id)animal{

    //id 类型是万能指针,可以指向任意的对象,实在使用中可以使用多种方法来检测是否有这个对象或者有这个方法, 

   [animal run];

    NSLog(@"%@在吃",_name);

}

@end


子类Dog的文件

.h文件:

#import "Animal.h"

@interface Dog : Animal

@end

.m文件:

#import "Dog.h"

@implementation Dog

-(void)run{

    NSLog(@"狗在跑");

}

@end


子类Cat的文件

.h文件:

#import "Animal.h"

@interface Cat : Animal

@end

.m文件:

#import "Cat.h"

@implementation Cat

-(void)run{

    NSLog(@"猫在跑");

}

@end

.main文件:

#import <Foundation/Foundation.h>

#import "Animal.h"

#import "Dog.h"

#import "Cat.h"

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

    @autoreleasepool {

        Animal * ani = [[Animal alloc]init];

        Dog * dog = [Dog new];

        dog.name = @"汪汪";

        ani = dog;

        //dog对象是否有run方法

        [dog respondsToSelector:@selector(run)];

        //dog对象是否是Animal的子类

       [dog isKindOfClass:[Animal class]];

        //dog是否是Animal

        [dog isMemberOfClass:[Animal class]];

        NSLog(@"%d", [dog respondsToSelector:@selector(run)] );     

        NSLog(@"%d",[dog isKindOfClass:[Animal class]]);

        NSLog(@"%d",[ani isMemberOfClass:[Animal class]]);

        [ani eat:dog]; 

    }

    return 0;

}

</textarea>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值