我想了解類別的實際使用,而不是Objective-C中的繼承。我應該什麼時候更喜歡使用一個類別?一個真實的代碼示例會很有幫助。什麼是類別的實際使用而不是繼承?
回答
當我需要添加一些方便的功能時,我會反覆使用現有的類,而無需子類覆蓋該類的某些現有功能。
例如,當我要檢查一個空字符串,或刪除一個字符串的所有前導和尾隨空格:
.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!
}
當您需要添加功能到現有的類。
例如,您的應用正在使用NSDate
或NSString
實例,並且您想添加一些功能。您無法將功能添加到子類,因爲您無法強制系統方法返回子類。
只要看看進API中的例子:
1/NSDictionary的用於保存的文件屬性,並且具有一個返回文件的大小的方法。
2/NSString
有一個用圖形擴展它的UI類別。請注意,您不需要可以繪製的單獨的字符串子類。你希望所有的字符串都能夠被繪製。
蘇丹解釋得很好。這是通過添加一個類別來擴展NSString功能的代碼example。您可以通過這種方式使用類別來擴展沒有實現它們的類,而無需對它們進行子類化。
如果您想要將方法添加到類中,請使用類別。如果你想改變類的現有方法的功能,創建一個子類。
它有點/有可能使用類別來替換現有的方法,有點像在子類中重寫,但不應該爲此使用類別。原因有三:1)您無法使用原始方法; 2)你不會破壞現有的代碼; 3)如果多於一個類別試圖「重寫」相同的方法,那麼類將最終結束的方法是未定義的。基本上,這個類將最後一個類應用到類中的方法結束,但不能依賴類應用的順序。這是一個混亂的祕訣,所以不要這樣做。
因此,您可以使用一個類別向NSData添加方法,如+(NSData*)dataWithCryptographicallyRandomBytes:(NSUInteger)length
或-(void)base64Decode
。但是如果你想改變現有方法的行爲,如-writeToFile:atomically:
,你應該創建一個NSData的子類並在那裏實現你的新功能。首先,您可能仍然希望在您的覆蓋中使用現有行爲,而通過調用[super writeToFile:file atmoically:YES]
可以實現子類化。此外,在這裏使用子類意味着你的新行爲只會影響你自己的代碼 - 它不會影響框架中其他地方的NSData的使用,可能不會期望你的新功能。
類別與Java接口類似(在java中,實現不是可選的) - 一種將方法分組並使對象響應特定API的方法 - 與類類型無關。如果您需要添加額外的ivars並且新類匹配isa關係(學生isa人),則繼承是有意義的。添加一些實用方法並不能解決問題 - 這通常是通過協議完成的。分類通常用於所涉及的方法是可選的代表。
我看到類別是一種更簡單的方式來實現繼承提供的一些功能。還有其他的東西不是通過繼承來提供的。類別允許您擴展現有類的功能,而無需對其進行子類化。您也可以使用它們來替換類中的現有方法。一個類別方法是一種螺栓連接到現有的類,而不像一個指向原始類的後代的子類。一旦類別方法被添加到目標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
類別的缺點是,如果你需要的成員變量添加到您的類不能使用它們。
- 1. Android - 什麼是實際使用 - 類別
- 2. 爲什麼類級別的typedef不是從tempates繼承的?
- 3. 繼承類結構是什麼樣的?
- 4. 繼承與類別有什麼區別
- 5. 使用組合而不是繼承
- 6. 從Own類繼承而不是從XMLParserRuleContext
- 7. 爲什麼使用靜態「常量」而不是實際值?
- 8. 繼承子類時的默認保護級別是什麼?
- 9. 繼承而不是typedef
- 10. 什麼是monoids的實際使用?
- 11. 重寫給定的類使用組合而不是繼承
- 12. 在c#中使用繼承而不是名稱別名是正確的嗎?
- 13. 什麼是在繼承類中使用鎖的最佳做法
- 14. 爲什麼Controller從GitHub上的ControllerBase繼承而不是VS?
- 15. 實現BitmapImage的功能而不繼承的最佳方式是什麼?
- 16. 什麼是createDataPartition實際使用列表
- 17. java類繼承和javabean繼承之間有什麼區別?
- 18. 爲什麼EF返回一個代理類而不是實際的實體?
- 19. 對事件使用對象類型而不是實際類型的原因是什麼?
- 20. 爲什麼建議從Exception繼承,而不是ApplicationException
- 21. 爲什麼pyuic4繼承對象而不是QDialog?
- 22. 使繼承的方法使用子類的變量而不是超類'
- 23. 爲什麼StringBuilder類不是從Stream繼承的?
- 24. Excel Floating Point Arihmetic - 它實際使用的是什麼類型
- 25. 爲什麼返回,而不是實際值的數據源
- 26. 選擇當前類的方法,而不是繼承的類
- 27. 什麼時候是類型(實例)而不是實例.__ class__?
- 28. 什麼是System.Transactions的實際用途?
- 29. jQuery的實際用途是什麼?
- 30. 什麼是克隆的實際用法
在obj-c中,您應該使用YES/NO而不是TRUE/FALSE。 – Sulthan 2012-02-19 11:39:18
好點。我使用了TRUE/FALSE。 – user523234 2012-03-15 14:57:46
在這種情況下,它應該是'return(myString.length == 0)':) – Sulthan 2012-03-15 17:01:28