可能重复:
如何从 NSDictionary 继承?
根据 API,我必须重写方法:
setObject:forKey:
removeObjectForKey:
initWithObjects:forKeys:
count
objectForKey:
keyEnumerator
你能提供一个关于如何覆盖它们的例子吗?
可能重复:
如何从 NSDictionary 继承?
根据 API,我必须重写方法:
setObject:forKey:
removeObjectForKey:
initWithObjects:forKeys:
count
objectForKey:
keyEnumerator
你能提供一个关于如何覆盖它们的例子吗?
这实际上比仅仅继承 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,它在设置 nil 对象时不会抛出异常,而是使用该键删除对象。对于您需要直接使用 forwardingTargetForSelector: 方法的任何剩余方法,这样您就可以让您的 _proxy 成员接管任何未实现的方法(尽管您需要改为子类化 NSObject 并显式声明您想要的可变字典所需的所有方法- 这是因为否则将使用真正的 NSMutableDictionary 方法,这将不起作用)。
- (id) forwardingTargetForSelector:(SEL)aSelector
{
return _proxy;
}