OC学习篇之—写类别(类的扩展)
首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做?
对于面向对象编程的话,首先会想到继承,但是继承有两个问题:
第一个问题:继承的前提是这个类可以被继承,因为在Java中有些类是不允许继承的,定义成final类,同样的OC中也是有不可以继承的类
第二个问题:这个类可以被继承,但是继承我们知道是侵入性的,就是我可能只是想实现一个功能,但是继承之后,子类就会把父类的所有功能(属性和方法)都继承了,这个代价太大了。没必要
所以对于Java中,我们可以使用聚合的方式去实现,
而对于C++的话,直接在定义一个功能类,然后让这个目标类继承功能类,因为C++中是可以多继承的
Java和OC是单继承的,不允许多继承
那么在OC中当然我们也可以像Java那种方式去采用聚合处理,但是OC中还有一个更强大的处理方式,那就是类别了,下面来看一下例子:我们现在想给NSString类提供一个校验邮箱的方法validateEmail,OC中NSString类就是不可以继承的。
不说了,直接看代码:
NSString+Extension.h
- //
- // Extension.h
- // 09_ClassTarget
- //
- // Created by jiangwei on 14-10-11.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- //定义类别的文件命名规则:类名+类别名称,如“NSString+Extension.h"
- @interface NSString (Extension)
- - (BOOL)validateEmail;
- //覆盖NSString中的intValue方法
- - (NSInteger)intValue;
- @end
NSString+Extension.m
- //
- // Extension.m
- // 09_ClassTarget
- //
- // Created by jiangwei on 14-10-11.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import "NSString+Extension.h"
- @implementation NSString (Extension)
- - (BOOL)validateEmail{
- NSRange range = [self rangeOfString:@"@"];
- if(range.location == NSNotFound){
- return NO;
- }else{
- return YES;
- }
- }
- //这里可以看出,这里是没办法调用NSString中得intValue方法,这个和继承有区别的
- - (NSInteger)intValue{
- NSLog(@"intValue");
- return 0;
- }
- @end
这里我们就定义了一个类目,下面来解释一下:
类别文件的定义格式:
类别的文件名的格式:"需要添加类别的类名+类别的名称"
比如这里我们需要对NSString类添加一个类目Extension,那么文件名就是:NSString+Extension.h和NSString+Extension.m
类目的定义格式:
@interface 需要添加类别的类名 (类别名)
....
@end
这个和类定义格式差不多,就是在后面多了一个括号类别名
例如:
@interface NSString (Extension)
....
@end
类别名是可以随便取的
看到上面的代码,在NSString+Extension.h中
我们就可以定义validateEmail方法了,同时我们在定义了一个intValue方法
intValue方法是NSString本身就有的,这里就是为了演示一下,如果在添加的类目中重新定义了类中的已有的方法,那么类目中的方法会被覆盖,和类的继承差不多,但是这里有一点需要注意,这里是不能使用super关键字去调用NSString的intValue方法的,所以intValue覆盖了NSString类中的intValue方法之后,NSString类中的intValue方法原先的功能就没有了,这个得注意一下。
看一下测试代码
main.m
- //
- // main.m
- // 09_ClassTarget
- //
- // Created by jiangwei on 14-10-11.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "NSString+Extension.h"
- //这里只是为了演示如果想扩展一个类的功能,可以通过继承的方式去实现
- //但是通过继承来实现这项功能话,有点大材小用的感觉,因为我们只需要一个判断邮箱的合法性的方法,所以继承就大了,没必要
- //但是这里会出错,因为NSString是不允许继承的
- //所以这里我们就要用到一个很强大的技术:类目
- //类目的定义和累的定义相似,在.h文件里声明,.m文件中实现方法
- //类目可以覆盖方法,但是不会再执行之前的那个方法了,而是调用新的方法
- //类目不能为类添加属性(实例变量)
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- NSString *s = @"123456@qq.com";
- BOOL isEmail = [s validateEmail];
- if(isEmail){
- NSLog(@"有效邮箱");
- }else{
- NSLog(@"无效邮箱");
- }
- //调用的是我们类目中的intValue方法
- NSInteger i = [s intValue];
- NSLog(@"intValue is %i",i);
- }
- return 0;
- }
这样我们就给NSString类添加了一个校验邮箱的方法,同时类目中的intValue方法也会覆盖原先类中的intValue方法。
通过这个例子,我们可以看到OC中的类目真的很强大呀!!
而且类目其实还有一个隐藏的用处,从他的字面意思上就知道具有分类的作用,比如一个类中的方法有时候我们可能会需要进行分类(比如:打印分类,比较分类等),这样代码看上去也很优雅。我们可以翻看Foundation框架中的NSArray类(这个类我们后面会说到的,和Java中的List差不多):
还有一个类目。
这里我们也了解到了,一个类是可以定义多个类目的。而且类目的作用可以沿袭到子类,就是父类的类目中的方法子类依然可以使用super关键字进行调用的。
总结
这一篇文章就介绍了OC中的一个强大功能类目,这个在对以后的扩展性起到至关重要的作用,也算是OC中的一个重点了,后续我们会经常用到这个功能。
OC学习篇之—写类别(类的扩展)的更多相关文章
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- OC学习篇之---单例模式
在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- (转载)OC学习篇之---类目的概念和使用
上一篇文章介绍了OC中的@class关键字的使用,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首 ...
- OC学习篇之---类目的概念和使用
上一篇文章介绍了OC中的@class关键字的使用http://blog.csdn.net/jiangwei0910410003/article/details/41774747,这一篇我们介绍一下,O ...
- (转载)OC学习篇之---概述
前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- OC学习篇之---类的三大特性(封装,继承,多态)
之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...
随机推荐
- chkconfig---检查设置系统服务
chkconfig命令 chkconfig命令检查.设置系统的各种服务.这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务 ...
- python 内存中写入文件(read读取不到文件解决)
from io import StringIO a = StringIO.StringIO('title') a.write('content1\n') a.write('content2') a.s ...
- 开始刷SGU
计划一天3题 请监督我 谢谢
- 【Educational Codeforces Round 36 D】 Almost Acyclic Graph
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找到任意一个环. 然后枚举删掉其中的某一条边即可. (因为肯定要删掉这个环的,那么方法自然就是删掉其中的某一条边 (其它环,如果都包 ...
- 【CS Round #39 (Div. 2 only) C】Reconstruct Sum
[Link]:https://csacademy.com/contest/round-39/task/reconstruct-sum/ [Description] 给你一个数字S; 让你找有多少对A, ...
- 免费的EmBitz可替代Keil MDK开发STM32、NXP项目
一.背景 由于使用之前开发STM32是基于Keil MDK编译环境开发的,由于该软件是收费的,想用个免费开源的软件来替代Keil,EmBitz编译器是免费的,可以完全替代开发.下载程序支持J-Link ...
- Vijos——T 1164曹冲养猪
https://vijos.org/p/1164 描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数 ...
- php中 重载(二)
接着上一次说的重载,我们了解下php中的重载,方法的重载,假设有管重载定义,參考:php中 重载(一)这个文章,谢谢.作为刚開始学习的人,大牛勿喷: 基本是两个方法 __call,当调用对一个不可訪问 ...
- Lamp(linux+apache+mysql+php)环境搭建
Lamp(linux+apache+mysql+php)环境搭建 .安装apache2:sudo apt-get installapache2 安装完毕后.执行例如以下命令重新启动apache:sud ...
- tomcat的一些简单配置
一.管理tomcatusernamepassword conf文件夹下,tomcat-users.xml <span style="font-size:24px;">& ...