可能重复:
如何从NSDictionary继承?
根据API,我必须覆盖方法:
setObject:forKey:
removeObjectForKey:
initWithObjects:forKeys:
count
objectForKey:
keyEnumerator
Run Code Online (Sandbox Code Playgroud)
你能提供一个关于如何覆盖它们的例子吗?
这实际上比仅仅子类化NSMutableDictionary更复杂.NSMutableDictionary(以及NSMutableArray)也是不透明的类.也就是说,它们只是隐藏动态数据结构的接口,而动态数据结构不像普通的具体类那样.特别是在创建NSMutableDictionary时,您将获得一个使用NSMutableDictionary接口的类,但实际上并不是NSMutableDictionary!这意味着返回的课程实际上不是你的班级,Yikes!子类NSMutableDictionary实际上是用自定义功能实现NSMutableDictionary接口.
您需要做的是让您的子类将数据结构作为成员变量(最简单的只是一个NSMutableDictionary)并在实现覆盖方法时使用该类.
例:
@interface MyMutableDictionary : NSMutableDictionary
... interface methods ...
@end
Run Code Online (Sandbox Code Playgroud)
和
@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
Run Code Online (Sandbox Code Playgroud)
这个例子是一个人为的例子,展示了如何实现一个自定义的NSMutableDictionary,它在设置nil对象时不抛出异常,而是用该键删除对象.对于你需要直接使用forwardingTargetForSelector:方法的任何剩余方法,你可以让你的_proxy成员接管任何未实现的方法(虽然你需要继承NSObject,并显式声明你想要的所有你想要的方法用于你的可变字典 - 这是因为否则将使用真正的NSMutableDictionary方法,这将无法工作).
- (id) forwardingTargetForSelector:(SEL)aSelector
{
return _proxy;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1780 次 |
| 最近记录: |