关于delegate, category和subclass
因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在cocoa中很重要时,我便更糊涂了…或许从C++或者Java转过来的高手一看就明白,所以高手您随便拍砖,指正我的错误;新手的话,不妨稍微看看,说不定对你理解这三个概念有些帮助。
总的来说,这三个概念的用途是:扩充已存在类的功能,说白了,就是给已经有的类加上其他的功能。
首先最常用的办法是,建立子类,继承父类的特点,加上新的类的内容。好处不言自明,自由:你想创建一个什么样的类就创建什么样的类,想加什么加什么。前提是,你需要继承以前的方法和属性。但是灵活性带来的问题是,太麻烦。有时候,我们也许只想加一个方法,这样你就不得不重新写一个类,生成两个新的文件。费劲。
于是乎我们有了category。它的最简单的用途就是给原有的类加新的方法。我们不需要新建一个类,就可以在原有的类基础上使用我们新的方法。
我这里使用一个最为简单但也最为常用的例子:在NSArray中添加deepCopy的功能。
如果我们使用子类,我们需要新建一个名为NSArrayWithDeepCopy的类,然后在这个类里面我们需要有如下的代码:
#import
@interface NSArrayWithDeepCopy:NSArray
-(NSArray*)deepCopy;
@end
当然这里还会有相应的一大堆的实现代码,恩,很麻烦阿。如果使用category,代码如何呢?我们只需要在使用深度拷贝的类里加上下面的代码就成了:
#import
@interface NSArray (DeepCopy)
-(NSArray*)deepCopy;
@end
大功告成。简单吧?反正我觉得这样挺简单的,呵呵。
最后是delegate,代理。代理是个在cocoa里用的很多的概念,尤其是在你进行界面的编程时,几乎总会用到这个概念。代理作为一种扩充类功能的手段,他的长处在于,我们可以使用一个代理的代码来扩充不止一个类的功能。也就是说,一个代理可以是几个类的代理,这样代理的功能就可以扩充给对应的类。
更为方便的是,代理作为一种在程序中埋藏的“彩蛋”,允许其他程序员对代理的功能作任意的修改,而不至于影响原有的类的功能,这样保证了良好的封装。举个常用的例子,我们要为关闭窗口写一个代理。这个代理怎么起作用的呢?其实在原来的窗口代码中,原来的程序员已经写下了“关闭窗口时,要执行代理方法XXX…”的语句,而他把这个代理方法的实现留给了你。你可以把这个代理方法写成是“直接关闭”,或者是“询问是否保存然后关闭”,或者是“询问是否保存,然后无论选择什么都不保存直接关闭…”。
原理上说,代理是一个包含有我们在原先的类里想要执行的代码的类。大家可能常见一个例子是说,代理是一个用来帮你做决定的类,比如说你原来的类有什么动作,然后做这个动作的时候,需要其他某些功能的配合,这时候你可以使用代理,让代理来起这个“配合”的作用。因为代理的功能与类的行为密切相关,所以在cocoa中,代理方法往往会在名字里包含did,will的词语,表示代理方法是在何时将被调用。
想要使用代理,首先,原类必须支持使用代理,也就是说,原来的类必须有一个delegate的接口,这样你在使用的时候,把你创建的代理类赋值给原来的类,这样原来的类如果遇到使用代理的某些方法,就会跑到你自己的代理类中寻求帮助。相比categary和subclass,代理的限制更多,因为你有时候只希望其他的程序员按照你希望的方式去扩充类的功能,但是实际应用的时候,代理让程序,特别是界面程序的设计,增加了很大的灵活性。
关于delegate, category和subclass的更多相关文章
- LLVM example for main
#include "llvm/IR/CallSite.h" #include "llvm/IR/Instruction.h" #include "ll ...
- SoftwareEngineering.APIDesign.iOS
API Design for iOS/Mac (Objective-c Edition) 1. UI Control Library API的设计 和已有组件保持一致(例如: 使用标准的API, 模型 ...
- OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏
//再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...
- 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- 基本语法 protocols Category extension
转:http://blog.csdn.net/wangeen/article/details/16989529 protocol 本质就是一系列的method的声明,他并不像class是必须的选项 ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- BlocksKit初见:一个支持将delegate转换成block的Cocoa库
简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调 ...
- c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]
A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. ...
- ios警告:Category is implementing a method which will also be implemented by its primary class 引发的相关处理
今天在处理项目中相关警告的时候发现了很多问题,包括各种第三方库中的警告,以及各种乱七八糟的问题 先说说标题中的问题 Category is implementing a method which ...
随机推荐
- 一个简单的Socket通信Demo
服务器端Demo: Server.java(服务器端运行主程序,直接运行): package cn.wjs; import java.net.InetAddress; import java.net. ...
- linux常用命令-搜索
1.find $ find . -name nginx* $ find . -name nginx* -ls $ find . -type f -mmin -10 搜索当前目录中,所有过去10分钟中更 ...
- Codeforces Round #280 (Div. 2) E. Vanya and Field 数学
E. Vanya and Field Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/492/pr ...
- Codeforces gym 100685 C. Cinderella 水题
C. CinderellaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/C ...
- spring读取properties的方法
首先在配置文件中配置PropertyPlaceholderConfigurer 单个配置文件: <bean id="propertyConfigurer" class=&qu ...
- delphi 取得汉字的第一个字母
功能说明://取得汉字的第一个字母 function GetPYIndexChar( hzchar:string):char;begin caseWORD(hzchar[1])shl8+WORD(h ...
- TreeView节点拖拉操作
//这个拖拽的感觉不对 unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...
- Android 滑动效果高级篇(七)—— 华丽翻页效果
By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前看到像ipad上的ibook的模拟书籍翻页的特效感觉很炫,在android上也有像laputa和ireader ...
- C#多线程交替赋值取值
static AutoResetEvent auto=new AutoResetEvent(false); ; ; static void Main() { Thread th1 = new Thre ...
- ASP.NET MVC and jqGrid 学习笔记 1-基本配置
新建一个mvc项目后