子类可能重复:
How to inherit from NSDictionary?如何从的NSMutableDictionary
从API据,我要覆盖的方法:
setObject:forKey:
removeObjectForKey:
initWithObjects:forKeys:
count
objectForKey:
keyEnumerator
你能提供一个关于如何重写它们的例子?
子类可能重复:
How to inherit from NSDictionary?如何从的NSMutableDictionary
从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设置为零对象时不抛出异常,而是去除带有该键的对象。对于任何剩下的方法,您只需直接使用forwardingTargetForSelector:方法,以便您可以让_proxy成员接管任何未实现的方法(尽管您需要继承NSObject的子类,并显式声明所需的所有可用于您的可变字典的方法 - 这是因为否则将使用真正的NSMutableDictionary方法,这将不起作用)。
- (id) forwardingTargetForSelector:(SEL)aSelector
{
return _proxy;
}
您能否给出一些上下文?你在用什么? –
也相关:http://stackoverflow.com/questions/1268261/inheritance-issues-in-objective-c – Chuck