我怎样才能从NSMutableDictionary中继承子类

时间:2012-10-17 03:35:39

标签: objective-c

  

可能重复:
  How to inherit from NSDictionary?

根据API,我必须覆盖这些方法:

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

您能举例说明如何覆盖它们吗?

1 个答案:

答案 0 :(得分: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;
}