-----<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. 走出测试,走向CEO

    飞测说:大家好,我们又见面了,我是黑夜小怪.不巧,今晚加班回来路上,湿身了,淋了个落汤鸡,不过明天也许可以看海了,也就呵呵了,原本想回来后聊些技术的,现在突然想先聊聊我的一些想法,仅供交流. 走出测试 ...

  2. [实战经验]Macbook pro 苹果系统换window系统

    1.       Macbook的window软件驱动备份 通过Boot Camp助手进行window支持苹果驱动下载 2.       拆机把SSD固态硬盘放在主盘位置,把苹果的机械盘放在光驱位置 ...

  3. Orchard官方文档翻译(十一) 使用Tags组织文本

    原文地址:http://docs.orchardproject.net/Documentation/Organizing-content-with-tags 想要查看文档目录请用力点击这里 最近想要学 ...

  4. Swift学习(三)类型推导&基本运算&分支&循环

    一.Swift中类型推导&基本运算 Swift中类型推导 如果一个标识符在定义时有直接赋值,那么可以根据后面赋值的类型,来推导出前面标识符的类型,这样前面标识符的(:类型)可以省略 查看标识符 ...

  5. 常用上传shell脚本

    #!/bin/bash FTP_IP=127.0.0.1 FTP_USER="aaa" FTP_PSW="bbb" GAME_NAME="ccc&qu ...

  6. UVa11210 中国麻将 Chinese Mahjong-搜索

    https://vjudge.net/problem/UVA-11210 //被水题虐了一上午... #include<iostream> #include<cstdio> # ...

  7. ubuntu 更新重启后 登录后 无法进入图形界面

    切换到控制台然后看看-/.Xauthority的组属性是否正确,如果被改成root组了,就会造成不能登陆,你将其删除就ok了

  8. A new start!

    从今天起,开始每天晚上拿出来半个小时到一个小时的时间来总结今天我做的那些事情,有哪些进步,有哪些不足,有哪些心得和笔记. 以前的学习都是每天学完就往脑袋后面一放,导致很多东西当时学会了,但是后面就都想 ...

  9. Dede后台验证码不显示解决方法详解(dedecms 5.7)

    今天朋友问我他本地与服务器上安装了dedecms5.7无法显示验证码,一般这种情况很少见,一般情况就是服务器设置问题,还有临时目录的权限问题 Dede后台验证码不显示或不正常分三种情况,下面来逐一分析 ...

  10. 10 Code Coverage Tools for C & C++

    Code coverage is a measure used in software testing that describes the degree to which the source co ...