Objective-C 里面的类对象复用小结
OC 提供了单继承 (Inheritance), Category, Extension, Protocol 这几种基本的类与对象层面的复用机制,作一小结。
在这几个机制中,继承提供了纵向的复用,可以扩展属性变量和方法,而 Category 只可以扩展方法,Extension 仅在拥有源代码的情况下可以使用,可扩展属性变量和方法,而 Protocol 则是仅仅提供抽象接口,类似于 C++ 中的抽象类模版。深入一点,继承的时候类实例的内存布局也同时被继承下来,而且这个布局是在编译时就决定了,在运行时不能改变,但是方法是保存在类的全局对象中的,可以在运行时 增加类的方法,这就是 Category(这个和JS里面的原型链比较相似)。因为OC里面的@implementaion ... @end 块隐含了类的构造方法和析构方法,以及属性变量的定义等,所以,OC的一个类的方法是要在一个源文件里面定义完毕的,不能像C/C++那样分散到不同的源文件进行编译,但是 Category 的@implementation ... @end 块是不隐含类的构造方法和析构方法的,这样,我们就可以在一个类上面创建多个Category,而且一个 Category 的定义(实现)可以分布在不同的源文件中,这就提供了一种构造大而复杂的类的方法(虽然不一定大家都喜欢)。Extension 的本质是匿名Category,它只有声明,而且可以多次声明,定义(实现)是在类的源文件里面进行的,在编译的时候同时也要编译类的源文件,同时在 Extension 的头文件中可以添加属性变量,这些变量只能在类的实现源文件中使用,否则编译器报错,所以,一般用来作为隐藏私有变量来使用。当某些类具有某个方面的共同操作时,这些共同操作可以抽象出 Protocol,可以理解为操作上的类 属,因为是抽象的,只有声明,没有定义或者实现,同时因为是类属,所以,一个类可以实现多个 Protocol 。OC 程序可以指定某个Protocol 的类型,比如 id<some_protocol> ,这个和C++里面的抽象类模板有点相似,最新版的LLVM也已经支持OC的范型编程了。
简而言之,继承提供了类型的数据与方法的复用,Category 提供了增加类型方法的途径,属于类型的增强,Extension 则提供了类型的私有数据的途径,Protocol 则是提供了类型的类属合约,不过它并不能生成类型。如果要使用类型生成,则可以使用Objective-C++中的模版。
Objective-C 里面的类对象复用小结的更多相关文章
- Java 继承、多态与类的复用
摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...
- Python学习day26-面向对象之小结
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- 18.Java 封装详解/多态详解/类对象转型详解
封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...
- C++ 类对象和 指针的区别
C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...
- Android 通过 Intent 传递类对象或list对象
(转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...
- NSLog(@"%@",类对象); 默认输出类名
NSLog()函数输出Objective-c对象时,输出的是该对象的description方法的返回值.也就是说,以下两行代码作用完全一样(假设p是指向任何对象的指针变量). NSLog(@" ...
- WPF整理-XAML构建后台类对象
1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...
- class中new与未new的区别 类对象占用空间--转载
转载自http://blog.sina.com.cn/shuiwuhendeboke 颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...
- 规则引擎集成接口(九)Java类对象
Java类对象 右键点击“对象库” —“添加java类对象”,如下图: 弹出窗体,在文本框中输入类的全名“com.flagleader.test.Test”,选择该类型后确定,如下: 显示如下,勾选上 ...
随机推荐
- 哨兵和docker容器
1,redis哨兵的配置 redis-6379配置文件内容如下 cat redis-6379.conf port 6379 daemonize yes logfile "6379.log&q ...
- unix2dos/dos2unix
dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter).DOS下的文本文件是以\r\n作为断行标志的 ...
- 基于struts环境下的jquery easyui环境搭建
下载地址: http://download.csdn.net/detail/cyberzhaohy/7348451 加入了json包:jackson-all-1.8.5.jar,项目结构例如以下: 測 ...
- 一步一步学Silverlight 2系列(4):鼠标事件处理
一步一步学Silverlight 2系列(4):鼠标事件处理 概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言V ...
- 如何制作.a静态库?合成多架构静态库?
08_01静态库 08_02制作静态库 .a 1.新建项目com+shift+n:选择Framework&Library. 2.下一步. 项目名不能为中文. 3.编写代码之后.用真机运行.会自 ...
- bzoj 4543 HOTEL 加强版
题目大意: 求树上取三个点这三个点两两距离相等的方案数 思路: 远古时候的$n^2$做法是换根 但那样无法继续优化了 学习了一波长链剖分 考虑如何在一棵树上进行dp 设$f[i][j]$表示以$i$为 ...
- 微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出?
ylbtech-微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出? 1.返回顶部 1. 让创意变为现实,这30个小程序“凭什么”脱颖而出? 微信公开课 昨天 创意1:为多种 ...
- 适用于PHP初学者的学习线路和建议
[导读] 这篇文章是围绕PHP的学习问题,之前介绍过<重磅资料!Github上的PHP资源汇总大全><深入探讨PHP类的封装与继承><PHP的学习规划建议>等对PH ...
- bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1} ...
- XML(php中获取xml文件的方式/ajax获取xml格式的响应数据的方式)
1.XML 格式规范: ① 必须有一个根元素 ② 不可有空格.不可以数字或.开头.大小写敏感 ③ 不可交叉嵌套 ④ 属性双引号(浏览器自动修正成双引号了) ⑤ 特殊符号要使用实体 ⑥ 注释和HTML一 ...