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)协议定义了一个其他对象可以实现的接口。


  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/frozen1224/p/4239096.html
Copyright © 2011-2022 走看看