Objective-C第六版第11章---Categroies and delegate

本章主要講解類型和協議

1. 類型:Categories.如果一個類想增加方法。可以通過Categories去增加方法。

注意:Categroies聲明和定義可以放在一個文件中。但是通常的做飯是把它放進兩個文件,一個頭文件,一個.m文件。只是命名有區別。通常使用“類名+類型名.h/m”。

類型名首字母也大寫。

例子:

//
//  Fraction+Comparison.h
//  Fraction
//
//  Created by zhengna on 15/6/30.
//  Copyright (c) 2015年 zhengna. All rights reserved.
//

#import "Fraction.h"

@interface Fraction (Comparison)

- (BOOL) isEqualTo: (Fraction *)f;
- (int) compare: (Fraction *)f;

@end

//
//  Fraction+Comparison.m
//  Fraction
//
//  Created by zhengna on 15/6/30.
//  Copyright (c) 2015年 zhengna. All rights reserved.
//

#import "Fraction+Comparison.h"

@implementation Fraction (Comparison)

- (BOOL) isEqualTo: (Fraction *)f{
    
    [self reduce];
    [f reduce];
    
    if (self.numerator == f.numerator && self.denominator == f.denominator){
        return YES;
    }else{
        return NO;
    }
}

- (int) compare:(Fraction *)f{
    
    [self reduce];
    [f reduce];
    
    float result = [self convertToNum] - [f convertToNum];
    
    if (result < 0) {
        return -1;
    }else if(result == 0){
        return 0;
    }else{
        return 1;
    }
}

@end

2. 類擴展。

其實它就是一種匿名的類型。

跟普通類型的區別:

1)沒有類型名

2)可以擴展主類的實例變量和方法,在普通類型裏不可以。

3)只能維護在主類的定義文件中,不可以在別的文件裏。

重要作用:類擴展中定義的實例變量和方法都是私有的。只能在類內部使用。

例子:

#import "Fraction.h"
// Make the reduce method private

@interface Fraction ()
-(void) reduce;
@end
// Define the methods for the Fraction class
@implementation Fraction
@synthesize numerator, denominator;
-(void) setNumerator: (int) n and Denominator: (int) d
{
...
]
...
@end

3. 協議。

協議是一組方法的集合用來在不同類之間共享。

它不提供定義只提供方法定義。這些方法的實施交由別的類或者你去實現。

@protocol NSCopying
- (id)copyWithZone: (NSZone *)zone;
@end

@interface AddressBook: NSObject <NSCopying>
協議的目的之一是標準化一些操作。

一個協議也可以加入另一個協議。

@protocol Drawing3D <Drawing>

也可以在.m文件中導入協議。


4. 代理Delegate

它是一中協議,可以把它理解爲兩個類之間的一個接口。

理解爲一個類定義的協議需要代理給實現這個協議的類去實現。

舉例說明:比如你想顯示一個UITableView去顯示一個Table, 但是UITableView不知道表格的標題, 有多少section, 一個section有多少row。 或者放在每列裏的內容是什麼(Cell)。 所以,它代理這個責任給你通過定義一個協議叫UITableViewDataSource. 當UITableView需要每個section裏有多少row的信息,它就會調用代理方法numberOfRowInSection。這個方法是需要你事先實現的。因爲UITableView不知道應該放多少行,只能代理給你去實現。


5. informal protocol

非正式協議。

可以用來實現一個系統已經定義的協議在主實現文件中,並且不需要實現這個協議裏的所有內容。

比如:這裏實現了一個informal protocal 'NSComparisonMethods'

#import "Fraction.h"

@interface Fraction (NSComparisonMethods) //informal protcol

- (BOOL)isEqualTo:(id)object;
- (BOOL)isLessThan:(id)object;
- (BOOL)isLessThanOrEqualTo:(id)object;
- (BOOL)isGreaterThanOrEqualTo:(id)object;
- (BOOL)isGreaterThan:(id)object;
- (BOOL)isNotEqualTo:(id)object;

@end

@implementation Fraction

@synthesize numerator, denominator;

// implement the informal protcol
- (BOOL)isEqualTo:(id)object{

    Fraction *arg = object;
    
    [self reduce];
    [arg reduce];
    
    if (self.numerator == arg.numerator && self.denominator == arg.denominator) {
        return YES;
    }else{
        return NO;
    }
}

6. 複合Composite

@interface Square: NSObject
{
Rectangle *rect;
}
-(int) setSide: (int) s;
-(int) side;
-(int) area;
-(int) perimeter;
@end



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章