OC多态特性详解

原创 2015年11月18日 21:26:08

多态在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>

相关文章推荐

OC中类的三大特性:封装、继承和多态

OC是一门面向对象的变成语言,具有面向兑现的最基本的特征:封装性、继承性、和多态性。 一.封装 为何要用封装? 当定义了一个类时,类中的数据不允许外界访问,或者允许外界只能读取不能修改而需要隐藏...
  • ACGJUN
  • ACGJUN
  • 2014年12月14日 01:36
  • 479

黑马程序员--OC的三大特性 封装 继承 多态

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------  面向对象的三大特性 1.封装2.组合3.多态 封装: 为什么要...

黑马程序员_iOS开发之OC之面向对象之三大特性封装、继承和多态

一、封装 1、封装的

黑马程序员——OC语言基础:面向对象三大特性,封装、继承、多态

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、封装性 1.set方法 #import @interface Student :...
  • Big_Zzq
  • Big_Zzq
  • 2015年04月27日 18:51
  • 371

黑马程序员 - OC语言 - 面向对象三大特性,封装、继承、多态

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-一、封装 1. set方法(提供一个方法,让外界设置成员变量的值,可以在方法里面对参数进行过滤) (1)...

黑马程序员—IOS基础之OC—类的三大特性封装、继承、多态

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

OC类的三大特性:继承,封装和多态

一、封装 封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,OC中有四种访问权限修饰符:public,default,protected,private,访问权限一...

黑马程序员---OC面向对象三大特性(封装、继承、多态)

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

OC的三大特性之多态

多态  1.没有继承就没有多态  2.代码的体现:父类类型的指针指向子类对象  3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象  4.局限性:  1> 父类类型的变量...

OC三大特性(封装继承和多态)以及分类和扩展

一.封装 二.继承: 子类可以直接复用父类中的成员.子类继承父类所有方法 非私有的成员变量以及协议 继承时要在.h中声明一下 继承具有单根性和传递性 继承的根类:大多都继承自 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC多态特性详解
举报原因:
原因补充:

(最多只允许输入30个字)