zoukankan      html  css  js  c++  java
  • 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.
    
    








  • 相关阅读:
    4header组件开发
    3组件骨架开发
    2项目目录设计
    1项目相关的一些简介
    21AJax与Comet
    20JSON
    获取特定筛选条件下数据的四分位点
    动态长度字符串的解析拆分问题
    myBase Desktop 7无限免费试用方法
    VBA 将Excel工作簿中所有表格进行一键排版
  • 原文地址:https://www.cnblogs.com/jiahao89/p/5118296.html
Copyright © 2011-2022 走看看