-----<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关于分类、扮演、协议的更多相关文章

  1. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  2. Objective-C语言分类与协议

    分类(Category)允许向一个类文件中添加新的方法声明,它不需要使用子类机制,并且在类实现的文件中的同一个名字下定义这些方法.其语法举例如下: #import "ClassName.h& ...

  3. Objective-C( protocol协议)

    protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...

  4. iOS开发笔记系列-基础5(分类和协议)

    分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ...

  5. Objective-C中的分类与协议

    分类 在谈分类之前,我们可以先探究下,OC中为什么出现分类这种机制,有什么好处? 假设你接到一个大项目:计算两个整数的和,差.接到任务的你马上动手.编写代码如下: #import <Founda ...

  6. OC基础8:分类和协议

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于分类(category): (1) ...

  7. 06-OC分类、协议、ARC

    目录: 一.分类 二.扩展 三.协议 四.内存管理ARC 回到顶部 一.分类 1 分类就是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类. 2 语法 * 文件中的语法@in ...

  8. 【Objective-C 基础】4.分类和协议

    1.分类 OC提供了一种与众不同的方式--Category,可以动态的为已经存在的类添加新的行为(方法) 这样可以保证类的原始设计规模较小,功能增加时再逐步扩展. 使用Category对类进行扩展时, ...

  9. obj-c编程08:分类和协议

    篇文章里我们来聊聊如何扩展一个类的方法和实例变量,我们首先来看一下命名分类如何扩展一个类.在下面的代码中,首先定义一个类Player用来定义普通球员,如果第三方开发者发现普通球员缺少了一些方法,则可以 ...

  10. iOS开发系列--Objective-C之协议、代码块、分类

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...

随机推荐

  1. jmeter随笔(9)--有两种编码风格,导致数据乱码

    问题:在一个网站,有两种编码风格,导致数据乱码 解决办法: 1.首先设置jmeter的配置文件 2.针对要求是utf-8格式的这样的请求,做单独的编码处理(beanshell处理) 3.运行,在htm ...

  2. Hibernate和JDBC、EJB比较

    参考:http://m.blog.csdn.net/article/details?id=7228061 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App S ...

  3. Beginning SDL 2.0(1) SDL功能简介

    原文链接为 http://wiki.libsdl.org/Introduction. 由于近期整理音视频可视化的技术,发现好久不更新的SDL发布了2.0版本,以前也没有过于关注,这里准备尝试下.了解S ...

  4. 【测试】模拟一个全表扫描的sql,对其进行优化走索引,并且将执行计划稳定到baseLine。

    ①创建表t3: SQL> create table t3 (id int); Table created. SQL; rows created. ②开启自动捕获并修改时间格式: SQL> ...

  5. python和php对比

    对php比较熟悉,最近开始学些python,总是搞混,特记录下来,用于熟悉python:1.python数组和php不同,php相对简单统一,即array(包括普通数组和关联数组两部分),python ...

  6. 操作笔记:linux下安装mysql

    1,检查linux下是否安装了mysql shell指令如下: [root@iZ945sgm0ugZ ~]# rpm -qa|grep -i mysql 如果有的话:做出挨个删除(eg:rpm -ev ...

  7. powerdesigner逆向导出oracle数据库结构显示备注

    最近接到命令,要将oracle数据库的结构导出为pdm文件供其他同事使用,逆向工程导出数据库结构比较方便,但是发现导出的数据库结构没有注释,这是很郁闷的事情: 查过网上很多资料都是sqlserver的 ...

  8. 在Win7下要通过某个 线程 来调用SavaDialog文件选择框的问题

    如果 在Win7下要通过某个 线程 来调用SavaDialog文件选择框的代码  选择窗口 有时会出不来 需要设置如下:    ThreadthreadOfRec = new Thread(Reciv ...

  9. VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...

  10. jquery css快捷方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...