1

可能重复:
如何从 NSDictionary 继承?

根据 API,我必须重写方法:

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

你能提供一个关于如何覆盖它们的例子吗?

4

1 回答 1

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,它在设置 nil 对象时不会抛出异常,而是使用该键删除对象。对于您需要直接使用 forwardingTargetForSelector: 方法的任何剩余方法,这样您就可以让您的 _proxy 成员接管任何未实现的方法(尽管您需要改为子类化 NSObject 并显式声明您想要的可变字典所需的所有方法- 这是因为否则将使用真正的 NSMutableDictionary 方法,这将不起作用)。

- (id) forwardingTargetForSelector:(SEL)aSelector
{
    return _proxy;
}
于 2012-10-17T04:02:06.203 回答