2012-10-17 26 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; 
} 
相关问题