Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性、继承性和多态性。

今天介绍一下Objective-C中的多态性。

一、什么是多态

多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

由于每个类都属于该类的名字空间,这使得多态称为可能。类定义中的名字和类定义外的名字并不会冲突。类的实例变量和类方法有如下特点:

  • 和C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的名字空间。

  • 类方法也同样位于该类独有的名字空间。与C语言中的方法名不同,类的方法名并不是一个全局符号。一个类中的方法名不会和其他类中同样的方法名冲突。两个完全不同的类可以实现同一个方法。

方法名是对象接口的一部分。对象收到的消息的名字就是调用的方法的名字。因为不同的对象可以有同名的方法,所以对象必须能理解消息的含义。同样的消息发给不同的对象,导致的操作并不相同。

多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。

Objective-C支持方法名的多态,但不支持参数和操作符的多态。

二、在Objective-C中如何实现多态

在Objective-C中是通过一个叫做selector的选取器实现的。在Objective-C中,selector有两个意思, 当用在给对象的源码消息时,用来指方法的名字。它也指那个在源码编译后代替方法名的唯一的标识符。 编译后的选择器的类型是SEL有同样名字的方法、也有同样的选择器。你可以使用选择器来调用一个对象的方法。

选取器有以下特点:

* 所有同名的方法拥有同样的选取器

* 所有的选取器都是不一样的

(1) SEL和@selector

选择器的类型是 SEL。@selector指示符用来引用选择器,返回类型是SEL。

例如:

SEL responseSEL;

responseSEL = @selector(loadDataForTableView:);

可以通过字符串来得到选取器,例如:

responseSEL = NSSelectorFromString(@"loadDataForTableView:");

也可以通过反向转换,得到方法名,例如:

NSString  *methodName = NSStringFromSelector(responseSEL);

(2) 方法和选取器

选取器确定的是方法名,而不是方法实现。这是多态性和动态绑定的基础,它使得向不同类对象发送相同的消息成为现实;否则,发送     消息和标准C中调用方法就没有区别,也就不可能支持多态性和动态绑定。

另外,同一个类的同名类方法和实例方法拥有相同的选取器。

(3) 方法返回值和@参数类型

消息机制通过选取器找到方法的返回值类型和参数类型,因此,动态绑定(例:向id定义的对象发送消息)需要同名方法的实现拥有相     同返回值类型和相同的参数类型;否则,运行时可能出现找不到对应方法的错误。

有一个例外,虽然同名灶方法和实例方法拥有相同的选取器,但是它们可以有不同的参数类型和返回值类型。

转载于:https://www.cnblogs.com/lm3515/p/3338409.html

iOS开发Objective-C基础之──多态相关推荐

  1. iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

    多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方 法所需要的代码,这使得它独立于其他的 ...

  2. 系列:iOS开发-C语言基础

    #系列:iOS开发-C语言基础 之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90% ...

  3. ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)

    iOS开发 -- C语言基础12(预处理指令) 宏定义 预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源 ...

  4. ios开发语言在c语言的基础上,iOS开发 - C语言基础4(基本语句和运算符) - 猫扑天空...

    iOS开发 - C语言基础4(基本语句和运算符) 基本语句 C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下 循环语句(do while.while.for) 条件语句(if .if- ...

  5. iOS开发学习专题-基础知识(一)NSString NSMutableString NSRange NSNotFound详细使用方式

    本文主要讲解的是不可变字符串NSStringNSString可变字符串NSMutableStringNSRangeNSNotFound详细使用方式 近期主要做的是iOS开发基础知识Objective- ...

  6. IOS开发之——数据库-基础知识介绍(01)

    一 概述 IOS中数据存储方式 SQLite数据库 使用Navicat执行表格操作 二 IOS中数据存储方式 Plist(NSArray\NSDictionary):只能存数据和字典 Preferen ...

  7. 无限互联iOS开发视频教程,Objective-c基础部份,官方高清HD迅雷下载

    http://bbs.lanrenios.com/thread-80-1-1.html

  8. 学习ios(必看经典)牛人40天精通iOS开发的学习方法

     亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做嘛?速来学习由51CTO学院整理的iOS精品视频集,42个视频课程一步步引领你成为一名iO ...

  9. 【转】iOS 开发怎么入门?

    原文网址:http://www.zhihu.com/question/20264108 iOS 开发怎么入门? 请问有设计模式.内存管理方面的资料吗?最好有除了官方文档之外的其它内容, 10 条评论 ...

  10. 那些在学习iOS开发前就应该知道的事(part 1)

    2019独角兽企业重金招聘Python工程师标准>>> 英文原文:Things I wish I had known before starting iOS development- ...

最新文章

  1. WebAssembly Studio:Mozilla提供的WASM工具
  2. linux虚拟网络设备之bridge(桥)(三)
  3. Java应用程序性能监视:复杂的分布式应用程序的端到端性能
  4. bash shell函数的定义及变量的简单说明
  5. JS逆向笔记-记录某测试论坛的js逆向练习
  6. 加快android编译速度
  7. cnn训练出现的问题
  8. a jquery 标签点击不跳转_jquery怎么让a标签不跳转?
  9. 几个常用JAVA开源项目的地址荟萃
  10. java程序包怎么更新,从Java 8升级到Java 11-软件包sun.util不存在
  11. mysql 23000_mysql – SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败...
  12. 对接极光IM之修改头像
  13. JavaScript高级程序设计——开篇前言
  14. 解除网页复制限制的Chrome插件-SuperCopy
  15. 用JAVA实现蓝桥杯基础训练之特殊回文数:123321是一个非常特殊的数,它从左边读和从右边读是一样的,输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
  16. 3.数据的一致性与一致性算法(CAP原则、Paxos算法、Raft算法、ZAB协议)
  17. 未来的计算机能帮人类炒股,未来计算机能帮人类炒股吗
  18. 中国未来经济发展方向,共享经济大势所趋
  19. 打开网络连接三种方法
  20. Codeforces #308 C. Vanya and Scales

热门文章

  1. 【英语天天读】第一场雪
  2. 贫血的Domain Model之说
  3. linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下
  4. 机器学习09支持向量机
  5. 您不能在64-位可执行文件上设置DEP属性?
  6. scanf函数详解(下)
  7. Android:Application
  8. eq相等,smarty 比较操作符!时间戳
  9. Xen的起源与工作原理
  10. Altiris™ IT Management Suite 7 Release Notes