2011-05-04 83 views
3

在細讀一些Apple Header文件時,我注意到他們使用類別爲同一對象聲明瞭多個接口。Apple Headers包含多個類別

例如:NSDictionary.h

@interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> 

//methods 

@end 

@interface NSDictionary (NSExtendedDictionary) 

//methods 

@end 

@interface NSDictionary (NSDictionaryCreation) 

//methods 

@end 

這是一個純粹的方式來幫助組織代碼?作爲用戶沒有區別,所有類別的所有方法在使用NSDictionary時都會出現。

這是否還有其他一些有用的結果?

回答

6

nielsbot有正確的想法,但有一個具體的技術原因的類別。您可以將實現放在單獨的文件中。 (當然,不同的翻譯單位技術上來說。)

文件1:

@implementation NSDictionary 
... 
@end 

文件2:

@implementation NSDictionary (NSExtendedDictionary) 
... 
@end 

文件3:

@implementation NSDictionary (NSDictionaryCreation) 
... 
@end 
+0

@Bavarious總結一下,在這種情況下:值得一提的是,如果你聲明瞭一個類別,你會得到一個警告,然後編寫一個'@ implementation'部分,它不會實現你聲明的所有方法。然而,沒有「@實施」部分的類別沒有問題,歷史上你可能已經在例如'NSObject'作爲創建_informal協議_的一種手段,但是Apple現在使用'@ protocol'關鍵字並推薦'@ protocol'來代替。 – alastair 2011-05-04 10:34:24

+0

反之亦然:您可以在不創建@interface部分的情況下爲類別編寫@implementation。我一直都在爲現有類的私有插件做這件事。再次 - 這是組織代碼的好方法。 – nielsbot 2011-05-04 19:08:50

3

很確定這是一個組織的事情。我不知道在公共頭文件中使用類別的其他好處。 (他們當然有用於插入新的方法到現有的類)

編輯: 查看維基百科。他們似乎有一個非常權威的答案:

在設計Objective-C期間,主要關心的問題之一是大代碼庫的可維護性。結構化編程世界的經驗表明,改進代碼的主要方法之一是將其分解成更小的代碼塊。 Objective-C借用並擴展了Smalltalk實現類別的概念,以幫助完成此過程。[9]

http://en.wikipedia.org/wiki/Objective-C#Categories

似乎適合,以及因爲系統的頭從接下來是 - 這些都是會以這種方式編寫代碼的傢伙。

+0

另外,像NSDictionary和NSArray這樣的容器類擁有基於尺寸等度量的多個後備數據結構,所以這種組織方式效果特別好,因爲您可以通過它們操作的數據結構分離出方法。 – kevboh 2011-05-04 01:46:32

+0

我不太確定維基百科參考是否真的解釋了它 - 我認爲它更多地談論創建一個像'NSDictionary'這樣的基類,然後使用一個類來擴展它,而不需要通過子類或其他可以創建更大塊的東西。這就是我的讀書 – Nektarios 2011-05-04 04:18:18