zoukankan      html  css  js  c++  java
  • 黑马程序员-分类(category)

     分类

    1 分类就是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类。

    2 语法

    * 文件中的语法@interface 主类类名(分类类名)

    * 文件名通常为:主类名+分类名

    * 调用方法时,只需要向主类引用放送消息即可

    3 使用分类的方式

    * 可以给一个类增加功能(增加方法)

    * 将类分成若干部分

    * 分类不但可以给自定义的类添加功能,还可以给不知道源代码的类添加功能。

    * 在分类中,不可以定义实例变量,也不可以定义属性,可以访问对象的属性

    * 在运行时,分类中的方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内的所有成员变量。

    * 若分类声明了与类中原有方法同名的函数,则分类中的方法会被调用。因此分类不仅可以增加类的方法,也可以代替原有的方法。这个特性可以用于修正原有代码中的错误,更可以从根本上改变程序中原有类的行为。若两个分类中的方法同名,则被调用的方法是不可预测的。

    通常来讲,分类是定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法

    //Fraction声明 

    #import <Foundation/Foundation.h>


    @interface Fraction : NSObject

    {

        int _numerator;

        int _denominator;

    }


    @property (nonatomic,assign) int numerator;

    @property (nonatomic,assign) int denominator;


    - (void) setNumerator:(int)numerator andDemominator:(int)denominator;

    - (void) reduce;

    - (Fraction *) add:(Fraction *)fraction;

    - (double) convertToNum;

    - (void) print;

    @end

    // Fraction类实现  

    #import "Fraction.h"


    @implementation Fraction


    - (void)setNumerator:(int)numerator andDemominator:(int)denominator

    {

        _numerator = numerator;

        _denominator = denominator;

        [self reduce];

    }

    - (void)reduce

    {

        int num = _numerator;

        int dem = _denominator;

        int temp;

        

        while (dem) {

            temp = num%dem;

            num = dem;

            dem = temp;

        }

        

        _numerator /= dem;

        _denominator /= dem;

    }

    -(Fraction *)add:(Fraction *)fraction

    {

        _numerator = _numerator*fraction.denominator + _denominator*fraction.numerator;

        _denominator = _denominator*fraction.denominator;

        [self reduce];

        return self;

    }

    - (double)convertToNum

    {

        double convert = _numerator/_denominator;

        return convert;

    }

    -(void)print

    {

        NSLog(@"%i/%i",_numerator,_denominator);

    }


    @end


    //Fraction类的FrozenMathOps分类声明 

    #import "Fraction.h"


    @interface Fraction (FrozenMathOps)

    - (Fraction *) add:(Fraction *)fraction;

    - (Fraction *) mul:(Fraction *)fraction;

    - (Fraction *) sub:(Fraction *)fraction;

    - (Fraction *) div:(Fraction *)fraction;

    - (void) fra;

    @end

     

    //Fraction类的FrozenMathOps分类实现  

    #import "Fraction+FrozenMathOps.h"


    @implementation Fraction (FrozenMathOps)

    - (Fraction *)add:(Fraction *)fraction

    {

        _numerator = _numerator*fraction.denominator + _denominator*fraction.numerator;

        _denominator = _denominator*fraction.denominator;

        [self reduce];

        return self;

    }

    - (Fraction *) mul:(Fraction *)fraction

    {

        _numerator = _numerator*fraction.denominator - _denominator*fraction.numerator;

        _denominator = _denominator*fraction.denominator;

        [self reduce];

        return self;

    }

    - (Fraction *)sub:(Fraction *)fraction

    {

        _numerator = _numerator*fraction.numerator;

        _denominator = _denominator*fraction.denominator;

        [self reduce];

        return self;

    }

    - (Fraction *)div:(Fraction *)fraction

    {

        _numerator = _numerator*fraction.denominator;

        _denominator = _denominator*fraction.numerator;

        [self reduce];

        return self;

    }

    - (void)fra

    {

        NSLog(@"frozen");

    }

    @end

     

    // Fraction类的o分类声明 

    #import "Fraction.h"


    @interface Fraction (o)

    - (void) fra;

    @end

    // Fraction类的o分类实现 

    #import "Fraction+o.h"


    @implementation Fraction (o)

    - (void)fra

    {

        NSLog(@"o");

    }

    @end

    //主头文件 

    #import <Foundation/Foundation.h>

    #import "Fraction.h"

    #import "Fraction+FrozenMathOps.h"

    #import "Fraction+o.h"


    int main(int argc, const char * argv[]) {

        @autoreleasepool {

            

            Fraction *fra = [[Fraction alloc] init];

            [fra fra];

        }

        return 0;

    }

    输出结果与编译的顺序有关,编译靠后的分类“特权高”,即分类方法名相同,执行编译靠后的分类。方法的优先顺序为

    分类(后编译分类>先编译分类)>该类>父类 

    协议

    1 协议就是规则,定义一个协议就相当于制定规则。

    OC中类遵守协议,就相当于拥有了一种能力。

    2 语法

    @protocol协议名

               @required声明必须遵守的属性和方法

               @optional声明可选的属性和方法

               默认@required

    3 一个类遵守一个协议

    @interface 类名(分类名):父类名 <协议名>

    4 使用协议类型的引用指向实现了协议或者遵守了协议的对象,id<TRProtocal> p = [[MyClass] init];

    [p ];可以向协议的引用发送消息,只能发送协议要求的消息

    5 协议的继承相当于协议的合并

    6 一个类可以同时遵守多个协议,协议之间用","号分开

    7 如果一个类遵守一个协议,那么它的子类也遵守。

    8 协议的使用和多态相类似,可以用作数组、参数、返回值类型,只不过多态返回的对象,一定要有继承关系,协议类型返回的对象,一定要有遵守协议或实现协议。

    3.代理模式

    (由别人帮自己实现某个功能的模式称为代理模式)

    1)接受代理

    @ interface 类名:父类名 <协议名>(多个协议之间用逗号隔开)

    ….

    @end

    2)确认协议

    @implementation类名

    协议方法

    {

    }

    @end

    (代理是谁,谁接受并确认协议)



    4.注意

    1)协议声明了可以被任何类实现的方法。

    2)协议定义了一个其他对象可以实现的接口。


  • 相关阅读:
    学习Java的第八天
    学习Java的第七天
    学习Java的第六天
    学习Java的第五天
    学习Java的第四天
    学习Java的第三天
    学习Java的第二天
    学习Java的第一天
    第九天
    第八次
  • 原文地址:https://www.cnblogs.com/frozen1224/p/4239096.html
Copyright © 2011-2022 走看看