2012-02-18 235 views

回答

2

當我需要添加一些方便的功能時,我會反覆使用現有的類,而無需子類覆蓋該類的某些現有功能。

例如,當我要檢查一個空字符串,或刪除一個字符串的所有前導和尾隨空格:

.h文件中:

@interface NSString (Extension) 

-(BOOL)isEmptyString; 
-(NSString *)trimLeadingAndTrailingWhiteSpaces; 

@end 

.m文件:

@implementation NSString (Extension) 

-(BOOL)isEmptyString 
{ 
    NSString *myString = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    if (myString.length == 0) 
     return TRUE; 
    else 
     return FALSE; 
} 

-(NSString *)trimLeadingAndTrailingWhiteSpaces 
{ 
    NSString *myString = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    return myString; 
} 
@end 

要使用它:

someString = [someString trimLeadingAndTrailingWhiteSpaces]; 

if ([someString isEmptyString]) 
     { 
     //someString is empty, do whatever! 
     } 
+1

在obj-c中,您應該使用YES/NO而不是TRUE/FALSE。 – Sulthan 2012-02-19 11:39:18

+0

好點。我使用了TRUE/FALSE。 – user523234 2012-03-15 14:57:46

+1

在這種情況下,它應該是'return(myString.length == 0)':) – Sulthan 2012-03-15 17:01:28

3

當您需要添加功能到現有的類。

例如,您的應用正在使用NSDateNSString實例,並且您想添加一些功能。您無法將功能添加到子類,因爲您無法強制系統方法返回子類。

只要看看進API中的例子:

1/NSDictionary的用於保存的文件屬性,並且具有一個返回文件的大小的方法。
2/NSString有一個用圖形擴展它的UI類別。請注意,您不需要可以繪製的單獨的字符串子類。你希望所有的字符串都能夠被繪製。

0

蘇丹解釋得很好。這是通過添加一個類別來擴展NSString功能的代碼example。您可以通過這種方式使用類別來擴展沒有實現它們的類,而無需對它們進行子類化。

0

如果您想要將方法添加到類中,請使用類別。如果你想改變類的現有方法的功能,創建一個子類。

它有點/有可能使用類別來替換現有的方法,有點像在子類中重寫,但不應該爲此使用類別。原因有三:1)您無法使用原始方法; 2)你不會破壞現有的代碼; 3)如果多於一個類別試圖「重寫」相同的方法,那麼類將最終結束的方法是未定義的。基本上,這個類將最後一個類應用到類中的方法結束,但不能依賴類應用的順序。這是一個混亂的祕訣,所以不要這樣做。

因此,您可以使用一個類別向NSData添加方法,如+(NSData*)dataWithCryptographicallyRandomBytes:(NSUInteger)length-(void)base64Decode。但是如果你想改變現有方法的行爲,如-writeToFile:atomically:,你應該創建一個NSData的子類並在那裏實現你的新功能。首先,您可能仍然希望在您的覆蓋中使用現有行爲,而通過調用[super writeToFile:file atmoically:YES]可以實現子類化。此外,在這裏使用子類意味着你的新行爲只會影響你自己的代碼 - 它不會影響框架中其他地方的NSData的使用,可能不會期望你的新功能。

0

類別與Java接口類似(在java中,實現不是可選的) - 一種將方法分組並使對象響應特定API的方法 - 與類類型無關。如果您需要添加額外的ivars並且新類匹配isa關係(學生isa人),則繼承是有意義的。添加一些實用方法並不能解決問題 - 這通常是通過協議完成的。分類通常用於所涉及的方法是可選的代表。

1

我看到類別是一種更簡單的方式來實現繼承提供的一些功能。還有其他的東西不是通過繼承來提供的。類別允許您擴展現有類的功能,而無需對其進行子類化。您也可以使用它們來替換類中的現有方法。一個類別方法是一種螺栓連接到現有的類,而不像一個指向原始類的後代的子類。一旦類別方法被添加到目標c類中,它就可以用於類的所有實例,包括那些不是由你創建的類。

例如,如果您需要加密函數,您需要在項目中的所有數據上使用加密函數,並說您的數據最多隻使用NString進行保存和操作。一,你可以去了解它的方式是爲的NSString創建類

的NSString-Encryption.h

@interface NSString (Encryption) 
    -(NSString*) encrypt; 
    @end 

的NSString-Encryption.m

#import "NSString-Encryption.h" 
@implementation NSString (Encryption) 
-(NSString*) encrypt 
{ 
// your encryption method here 
    return encryptedString; 
} 
@end 

UseNSString,encryption.m

NSString *testString = @"this is test"; 
NSString *encryptedString = [testString encrypt]; 

正如您所看到的,類別比子類更容易使用。這個方法可以從NSMutableString調用,也可以從NSString繼承。所以它很強大。

您還可以使用類別來替換類上的現有方法。

一個類別的另一個用途是它可以用於私有方法因爲目標c沒有正式的方法專用名稱。這通過將一個類別放入.m文件而不是.h文件來完成。

Phone.h

@interface Phone:NSObject 
-(void) call; 
@end 

Phone.m

@interface Phone(Private) 
     -(void) validatePhoneEntry:(NSString*) phoneNumber; 
    @end 

    @implementation Phone 

    -(void) validatePhoneEntry:(NSString*) phoneNumber 
    { 

    } 

    -(void) call 
    { 
    } 

    @end 

類別的缺點是,如果你需要的成員變量添加到您的類不能使用它們。

相關問題