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 里面的类对象复用小结的更多相关文章

  1. Java 继承、多态与类的复用

    摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...

  2. Python学习day26-面向对象之小结

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  3. 18.Java 封装详解/多态详解/类对象转型详解

    封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...

  4. C++ 类对象和 指针的区别

    C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...

  5. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  6. NSLog(@"%@",类对象); 默认输出类名

    NSLog()函数输出Objective-c对象时,输出的是该对象的description方法的返回值.也就是说,以下两行代码作用完全一样(假设p是指向任何对象的指针变量). NSLog(@" ...

  7. WPF整理-XAML构建后台类对象

    1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...

  8. class中new与未new的区别 类对象占用空间--转载

    转载自http://blog.sina.com.cn/shuiwuhendeboke    颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...

  9. 规则引擎集成接口(九)Java类对象

    Java类对象 右键点击“对象库” —“添加java类对象”,如下图: 弹出窗体,在文本框中输入类的全名“com.flagleader.test.Test”,选择该类型后确定,如下: 显示如下,勾选上 ...

随机推荐

  1. #!/usr/bin/env ruby 与 #!/usr/bin/ruby 的区别(copy)

    [说明:资料来自http://blog.csdn.net/wh_19910525/article/details/8040494] 脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执 ...

  2. JavaScript 算法与数据结构(转载)

    JavaScript 算法与数据结构 https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md

  3. Postgresql个人维护库时,出现有用户在连接又找不到这个用户是谁的强制中断连接的方法;

    方法一: 去PostgreSQL目录下/data/pgdata/9.4,找到pg_hba.conf, 修改pg_hba.conf的白名单IP (修改前,最好服务已停止,我是这么操作的) # IPv4 ...

  4. 在Visual studio 中解除 TFS 的账号绑定

    在Visual Studio中, 只要使用了TFS, 就会要求输入用户名密码验证 . 但是一旦点击验证对话框下部的:记住用户名密码 以后都不能再修改用户名了. 而且重装Visual Studio 听说 ...

  5. mysql查询流程

    首先是连接器 连接器负责跟客户端来链接 链接成功后 mysql会先去查询缓存,之前是不是有查询的这条语句,之前执行过的话 就会以key-value的形式缓存到内存中,如果没有就会继续执行后面的,执行完 ...

  6. 第四篇(那些JAVA程序BUG中的常见单词)

    xxx cannot be resolved to a variable xxx无法解析为变量 resolve 解析

  7. Luogu P1273 有限电视网【树形Dp/树形背包】

    题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...

  8. 进击的Python【第十六章】:Web前端基础之jQuery

    进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...

  9. JDK与JRE、JVM三者间的关系及JDK的安装部署

    JDK与JRE.JVM三者间的关系及JDK的安装部署 一.JDK与JRE.JVM三者间的关系 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了 ...

  10. Rooks LightOJ - 1005

    https://vjudge.net/problem/LightOJ-1005 题意:在n*n的矩形上放k个车,使得它们不能互相攻击,求方案数. ans[i][j]表示在i*i的矩形上放j个车的方案数 ...