Objective-C关于分类、扮演、协议
-----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
在本章中,我们将介绍o bj ec t i ve-C面向对象编程中的3种功能:分类(category)、扮演(posing)和协议(protocol)。分类允许我们通过给一个类添加方法来扩展它,并且我们不需要访问基类的代码就可以做到这点l我们可以为~个类创建新的方法'而不需要在代码中编辑类定义。当无法访问~一个类的源代码的时候,或者当不想修改源代码的时候,或者当想要以不同的方式定制~一个类的时候,这会很有用。
要使用分类,我们为新方法创建一个带有接口的新文件,使用Objectlve-C语法来表示在扩展另一个类,然后把新方法的实现放入另一个文件中。分类是我们添加到该类的新方法的实际名称。
扮演涉及把一个类”扮演“成另一个类。假设有一个类Class1,还有另一个类Class2它派生自Class1的对象。但是,我们可以告诉Class2去扮演成Class1.从此以后,在我们代码中,只要创建Class1的一个对象,实际上是在创建Class2的对象。换句话说,Class2扮演成了Class1.
条条大路通罗马,当然,我们也可以使用多态。但是使用扮演会更清楚,因为我们不必在代码中总是记录在变量里保存了何种类型的指针。
协议也Java中所谓的接口很相似。协议是针对一个方法的规范,很像是方法的原型。当我们表明某个类使用特定的协议的时候,即表明了该类实现了哪些方法。换句话说,协议允许我们的声明方法,由你在类中定义实现。
这是Objective-C中最近多继承的功能,在多继承中,我们可以继承自多个类,因为使用协议,我们可以确保所有的派生类都实现相同的方法(尽管每个类中的实际实现可能不同)。这很有用,例如,如果我们有两个基类,分别名为Animal和Pet,并且想要从它们派生名为Cat和Dog类。我们可以通过使用协议来确保cat和Dog实现了Animal和Pet的方法。当Cat和Dog使用了Animal和Pet定义的协议的时候,Cat和Dog都自动实现了一系列的方法。
1.关于分类
分类允许我们通过定义新方法来扩展一个类,即便没有访问类访问类的源代码或者没有修改它。假设有一个类Class1,它有一个单个的方法method1,在类的头文件中:
#include <Foundation/Foundation.h>
@interface Class1:NSObject
-(return_type) method1;
@end
假设在类的实现文件中,该方法定义,为
#include <stdio.h>
#import <Foundation/Foundation.h>
@implementation Class1
-(return_type) method1
{
}
@end
如果想通过,添加一个新方法method2来扩展Class1,我们可以创建一个新的头一个文件,它列出了method2接口,如下所示
@interface Class1(Extender)
-(return_type)method2;
@end
注意,类后的圆括号中术语Extender。在这里,我们可以使用想要任何术语来表示正在扩展基类,并给扩展一个名称。当在method2自己文件中创建实现的时候,我们在圆括号中使用同样的术语:
#import <stdio.h>
#include <Foundation/Founation.h>
@implementation Class1(Extender)
-(return_type) method2
{
}
@end
通过这种方法,Objective-C允许我们扩展类而不修改他们的源代码文件。
2.关于扮演
扮演允许一个类去代替另一类。假设有一个类Class1,它带有一个单个的方法method1,它带有一个单个的方法method1,在该类的头文件中:
#import <Foundation/Foundation.h>
@interface Class1:NSObject
-(return_type) method1;
@end
假设该方法在类的实现文件中重新定义了该类,并且Classe2是基于Class1的
#import <Foundation/Foundation.h>
@interface Class2:Class1
-(return_type) method1;
@end
3.关于协议
协议允许我们为在多个类中,使用的一个方法或多个方法指定接口。例如,如果我们一个名为print的方法,并且想要为为它创建一个协议,那么可以在一个名为printing.h文件中做到这一点:
@protocol Printing
-(void ) print;
@end
然后,我们可以把printing.h文件包含到其他类的接口文件中。
协议允许我们按照这种方式定义一个方法接口。尽管Objective-C没有真正的多继承能力,但我们可以使用多个协议(而不是类)作为派生类的基础。协议确定包含什么方法,并且指定他们的返回类型,但是,这些方法在派生类中实现取决于我们。这就相当接近Objective-C实现了多继承(在真正的多继承中,我们可以从多个基类派生一个类。)
协议:定义协议和接口
当我们一个方法活多个方法定义一个协议的时候,通常把协议存储在一个头文件中,我们为一个名为printing.h文件中,我们建立一个名为print的方法。创建了一个名为Printing的协议:
@protocol Printing
-(void) print;
@end
然后,在一个名为ClassFirst.h接口文件中,我们将为一个类使用该协议:
#include <Foundation/Foundation.h>
#import "printing.h"
@interface Class1:NSobject
-(void) print;
@end
我们还将在一个接口文件ClassSend.h中使用协议Printing协议的时候,用于针对从第一个类派生来的一个类:
#include ”Class1.h“
#import "printing.h "
@interface Class2:Class1
@end
然后,我们将以不同的方式为Class1和Class2实现print方法(在下一个任务中实现)。
附:
printing.h
@protocol Printing
-(void) print;
@end
ClassFrist.h
#include <Foundation/Foundation.h>
@interface Class1:NSobject
-(void) print;
@end
ClassSecond.h
#include "Class1.h"
#import "printing.h "
@interface Class2:Class1
@end
main.m
<pre name="code" class="objc">#import <stdio.h>
#import <Class1.h>
#import <Class2.h>
int main()
{
Class1 *c=[Class1 new];
[c print];
Class2 *c2=[Class2 new];
[c2 print];
return 0;
}
运行main.m,可以看到如下结果:
This is Class1.
This is Class2.
Objective-C关于分类、扮演、协议的更多相关文章
- 04OC之分类Category,协议Protocol,Copy,代码块block
一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...
- Objective-C语言分类与协议
分类(Category)允许向一个类文件中添加新的方法声明,它不需要使用子类机制,并且在类实现的文件中的同一个名字下定义这些方法.其语法举例如下: #import "ClassName.h& ...
- Objective-C( protocol协议)
protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...
- iOS开发笔记系列-基础5(分类和协议)
分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ...
- Objective-C中的分类与协议
分类 在谈分类之前,我们可以先探究下,OC中为什么出现分类这种机制,有什么好处? 假设你接到一个大项目:计算两个整数的和,差.接到任务的你马上动手.编写代码如下: #import <Founda ...
- OC基础8:分类和协议
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于分类(category): (1) ...
- 06-OC分类、协议、ARC
目录: 一.分类 二.扩展 三.协议 四.内存管理ARC 回到顶部 一.分类 1 分类就是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类. 2 语法 * 文件中的语法@in ...
- 【Objective-C 基础】4.分类和协议
1.分类 OC提供了一种与众不同的方式--Category,可以动态的为已经存在的类添加新的行为(方法) 这样可以保证类的原始设计规模较小,功能增加时再逐步扩展. 使用Category对类进行扩展时, ...
- obj-c编程08:分类和协议
篇文章里我们来聊聊如何扩展一个类的方法和实例变量,我们首先来看一下命名分类如何扩展一个类.在下面的代码中,首先定义一个类Player用来定义普通球员,如果第三方开发者发现普通球员缺少了一些方法,则可以 ...
- iOS开发系列--Objective-C之协议、代码块、分类
概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...
随机推荐
- jmeter随笔(9)--有两种编码风格,导致数据乱码
问题:在一个网站,有两种编码风格,导致数据乱码 解决办法: 1.首先设置jmeter的配置文件 2.针对要求是utf-8格式的这样的请求,做单独的编码处理(beanshell处理) 3.运行,在htm ...
- Hibernate和JDBC、EJB比较
参考:http://m.blog.csdn.net/article/details?id=7228061 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App S ...
- Beginning SDL 2.0(1) SDL功能简介
原文链接为 http://wiki.libsdl.org/Introduction. 由于近期整理音视频可视化的技术,发现好久不更新的SDL发布了2.0版本,以前也没有过于关注,这里准备尝试下.了解S ...
- 【测试】模拟一个全表扫描的sql,对其进行优化走索引,并且将执行计划稳定到baseLine。
①创建表t3: SQL> create table t3 (id int); Table created. SQL; rows created. ②开启自动捕获并修改时间格式: SQL> ...
- python和php对比
对php比较熟悉,最近开始学些python,总是搞混,特记录下来,用于熟悉python:1.python数组和php不同,php相对简单统一,即array(包括普通数组和关联数组两部分),python ...
- 操作笔记:linux下安装mysql
1,检查linux下是否安装了mysql shell指令如下: [root@iZ945sgm0ugZ ~]# rpm -qa|grep -i mysql 如果有的话:做出挨个删除(eg:rpm -ev ...
- powerdesigner逆向导出oracle数据库结构显示备注
最近接到命令,要将oracle数据库的结构导出为pdm文件供其他同事使用,逆向工程导出数据库结构比较方便,但是发现导出的数据库结构没有注释,这是很郁闷的事情: 查过网上很多资料都是sqlserver的 ...
- 在Win7下要通过某个 线程 来调用SavaDialog文件选择框的问题
如果 在Win7下要通过某个 线程 来调用SavaDialog文件选择框的代码 选择窗口 有时会出不来 需要设置如下: ThreadthreadOfRec = new Thread(Reciv ...
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...
- jquery css快捷方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...