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中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月04日 22:20
  • 31298

OC中的多态性再详解

面向对象的三大特性:封装、继承、多态 假如说·现在有个例子狮子吃动物; 现有狮子类。 #import @class Animal; @interface Lion : NSObject ...
  • yang361
  • yang361
  • 2015年08月15日 18:05
  • 1008

OC-多态使用介绍

1、什么是多态?       多态就是某一类事物的多种形态。        程序中的多态,不同的对象以自己的方式相应相同名称方法的能力称为多态 2、多态的条件:1)、有继承关系,有方法重写      ...
  • u013977285
  • u013977285
  • 2015年08月27日 23:02
  • 686

java提高篇(三)-----理解java的三大特性之多态

面向对象编程有三大特性:封装、继承、多态。        封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访...
  • chenssy
  • chenssy
  • 2013年10月16日 19:44
  • 57561

C#的多态特性

C#多态特性
  • Lin_For_Game
  • Lin_For_Game
  • 2015年08月04日 11:15
  • 644

第四篇:OC中的多态应用

1.什么是多态: 》多态就是某一类事物的多种形态    如:猫 == 猫 == 动物           男人 == 男人 == 人 == 高级动物 2.多态的前提:没有继承就没有多态...
  • u010372095
  • u010372095
  • 2015年09月10日 23:31
  • 438

object c中的多态

1,何为多态:不同对象可以访问相同方法的能力或现象。 2,多态的优势:不同的类对象可以使用习惯的调用方式;简化了编程接口;实现类和实例的接口隔离。 动态绑定,多态,在C++中主要是指基类指针,...
  • leikezhu1981
  • leikezhu1981
  • 2014年02月18日 23:52
  • 3074

对OC的理解 以及 OC的特性

OC作为一门面向对象的语言,自然具有面向对象的语言特性,如:封装、多态、继承。它具有静态语言的特性,又有动态语言的效率。总体来说,它确实是一门不错的编程语言。Objective-C 具有相当多的动态特...
  • gogosmilex
  • gogosmilex
  • 2015年09月21日 11:28
  • 840

iOS多态特性

多态的特性在iOS开发,尤其是在整个app的架构搭建当中,用的比较多,一般在比较大,复杂的app中应用广泛。理解多态,能够写出比较优雅的代码,设计出优秀的应用架构。 抽象的打印机类Printer...
  • xiaowenwen1010
  • xiaowenwen1010
  • 2015年10月14日 01:08
  • 1315

java面向对象的四大特性-多态,继承,抽象,封装

1.多态 面向对象的四大特性:封装、继承、多态、抽象。从一定角度来看,封装和继承几乎都是为多态而准备的。是最重要的知识点。多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对...
  • basycia
  • basycia
  • 2016年07月07日 12:54
  • 4148
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC多态特性详解
举报原因:
原因补充:

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