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”,选择该类型后确定,如下: 显示如下,勾选上 ...
随机推荐
- 2016/2/29 html 思维导图
- Django初识二
1,在django中用于提交的form表单中的三要素: 1.1>form标签要有action和method,上传文件需要额外指定的enctype 1.2>获取用户输入的标签要有name属性 ...
- Java类加载机制?
深入研究Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比 ...
- Linux 下的编辑/编译器
linux 首先有两个重量级的文本编辑器:vim 和 emacs 此外有如下三种比较好的开放环境: 1.Anjuta Anjuta DevStudio 的官方地址:http://anjuta.sour ...
- LIKIE INSTR
SELECT url FROM test_url WHERE FROM_UNIXTIME(create_time,'%Y%m%d %H') < '20171218 00' AND no ...
- 在调试状态查看DateTable里的数据信息
- YTU 2959: 代码填充--雨昕学矩阵
2959: 代码填充--雨昕学矩阵 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 50 题目描述 雨昕开始学矩阵了.矩阵数乘规则:一个数k乘一个矩阵A还是一个矩阵,行数 ...
- C# ref和out总结
C# 中ref 与 out 总结 参数的传递一般分为两种:一种是“值传递”即:传递实参的拷贝,既然是拷贝那么在函数中对这个形参所作的任何动作都不会反映到原来的实参中.另外一种是“引用传递”即:传递 ...
- iOS7 push/pop转场动画
前言 iOS 7之后,苹果提供了自定义转场动画的API,我们可以自己去定义任意动画效果.本篇为笔者学习push.pop自定义转场效果的笔记,如何有任何不正确或者有指导意见的,请在评论中留下您的宝贵意见 ...
- 机器学习: KNN--python
今天介绍机器学习中比较常见的一种分类算法,K-NN,NN 就是 Nearest Neighbors, 也就是最近邻的意思,这是一种有监督的分类算法,给定一个 test sample, 计算这个 tes ...