2012-10-17 52 views
1

子類可能重複:
How to inherit from NSDictionary?如何從的NSMutableDictionary

從API據,我要覆蓋的方法:

setObject:forKey: 
removeObjectForKey: 
initWithObjects:forKeys: 
count 
objectForKey: 
keyEnumerator 

你能提供一個關於如何重寫它們的例子?

+0

您能否給出一些上下文?你在用什麼? –

+0

也相關:http://stackoverflow.com/questions/1268261/inheritance-issues-in-objective-c – Chuck

回答

5

這實際上比僅僅繼承NSMutableDictionary更復雜。 NSMutableDictionary(和同樣NSMutableArray)是不透明的類。這就是說,它們僅僅是隱藏動態數據結構的接口,而不像通常的具體類一樣。特別是當你創建一個NSMutableDictionary時,你會得到一個利用NSMutableDictionary接口的類,但實際上並不是一個NSMutableDictionary!這意味着返回的班級實際上不會成爲你的班級,Yikes!子類NSMutableDictionary實際上是實現具有自定義功能的NSMutableDictionary接口。

你需要做的是讓你的子類有一個數據結構作爲成員變量(最簡單的就是一個NSMutableDictionary),並在你實現你的覆蓋方法時使用該類。

例如:

@interface MyMutableDictionary : NSMutableDictionary 

... interface methods ... 

@end 

@implementation MyMutableDictionary 
{ 
    NSMutableDictionary* _proxy; 
} 

- (id) init { 
    if (self = [super init]) { 
     _proxy = [[NSMutableDictionary alloc] init]; 
    } 
    return self; 
} 

... implementation of methods ... 

- (void) setObject:(id)obj forKey:(id)key { 
    if (obj) { 
     [_proxy setObject:obj forKey:key]; 
    } else { 
     [_proxy removeObjectForKey:key]; 
    } 
} 

@end 

這個例子是一個人爲一個說明如何實現自定義的NSMutableDictionary設置爲零對象時不拋出異常,而是去除帶有該鍵的對象。對於任何剩下的方法,您只需直接使用forwardingTargetForSelector:方法,以便您可以讓_proxy成員接管任何未實現的方法(儘管您需要繼承NSObject的子類,並顯式聲明所需的所有可用於您的可變字典的方法 - 這是因爲否則將使用真正的NSMutableDictionary方法,這將不起作用)。

- (id) forwardingTargetForSelector:(SEL)aSelector 
{ 
    return _proxy; 
} 
相關問題