-----<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

  1. @protocol Printing
  2. -(void) print;
  3. @end

ClassFrist.h

  1. #include <Foundation/Foundation.h>
  2. @interface Class1:NSobject
  3. -(void) print;
  4. @end

ClassSecond.h

  1. #include "Class1.h"
  2. #import "printing.h "
  3. @interface Class2:Class1
  4. @end

main.m

  1. <pre name="code" class="objc">#import <stdio.h>
  2. #import <Class1.h>
  3. #import <Class2.h>
  4. int main()
  5. {
  6. Class1 *c=[Class1 new];
  7. [c print];
  8. Class2 *c2=[Class2 new];
  9. [c2 print];
  10. return 0;
  11. }

运行main.m,可以看到如下结果:

  1.  
  1. This is Class1.
  1. This is Class2.
  1.  

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. android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件

    在开发中遇到ScrollView嵌套ListView的问题,最开始发出不能全屏,效果是这样的: 但我想要的效果是这样的: 下面看一下布局文件: <?xml version="1.0&q ...

  2. SVN+FTP服务器搭建(一)——SVN安装配置篇

    Subversion是一个自由,开源的版本控制系统.在Subversion管理下,文件和目录可以超越时空.Subversion将文件存放在中心版本库里.这个版本库很像一个普通的文件服务器,不同的是,它 ...

  3. [翻译]你真的知道你看到的UTF-8字符是什么吗?

    翻译自http://www.pixelstech.net/article/1397877200-You-know-what-UTF-8-is-when-you-see-it- Source : son ...

  4. 关闭窗体后,利用StreamWriter保存控件里面的数据

    以保存DataGridView里面的数据为例: 通过窗体增加的数据,没有用数据库保存,可以使用StreamWriter将数据存在临时文件里面,再次打开窗体时写入即可. private void For ...

  5. Ov

  6. linux 下 jdk tar.gz 包安装方法

    JDK安装 tar.gz为解压后就可使用的版本,这里我们将jdk-7u3-linux-i586.tar.gz解压到/usr/local/下. 1.解压 解压到当前目录:$ tar -zxvf /opt ...

  7. Shiro使用总结

    Shiro已经添加到项目中,现阶段管理两个功能: 1.身份验证:(已经能够满足现阶段需求) 2.权限管理: 权限管理,需要在界面中加一些标签,后台角色.资源的管理也需要整理好,然后在前端添加管理. 1 ...

  8. 1.5如何学习Linux驱动开发

    1.准备一个自己熟悉的Linux操作系统,用于开发和测试Linux驱动,建议使用Ubuntu Linux 10.04及以上版本: 2.准备一块开发板,建议采用基于ARM11的开发板: 3.学习GUN ...

  9. 搭建高性能计算环境(十)、应用软件的安装之Wien2k

    1,首先安装fftw .tar.gz cd fftw- ./configure --prefix=/opt/fftw- --enable-shared --enable-float --enable- ...

  10. 详说 Cookie, LocalStorage 与 SessionStorage

    本文最初发布于我的个人博客:咀嚼之味 最近在找暑期实习,其中百度.网易游戏.阿里的面试都问到一些关于HTML5的东西,问题大多是这样开头的:“你用过什么HTML5的技术呀?” 而后,每次都能扯到 Co ...