Вы, вероятно, не хотите переопределять valueForKey
, потому что NSDictionary
и NSMutableDictionary
являются абстрактными базовыми классами, скрывающими кластер классов за ними.Согласно их документации, в прямом подклассе вам необходимо переопределить все:
- setObject: forKey:
- removeObjectForKey:
- count
- objectForKey:
- keyEnumerator
Проще реализовать альтернативный класс, который претендует на то, чтобы быть NSMutableDictionary, но перенаправляет любые вызовы, которые он не понимает, на фактический NSMutableDictionary.Что вы можете сделать с помощью forwardingTargetForSelector: .
Например,
@interface MyFakeDictionary: NSObject
{
NSMutableDictionary *theRealDictionary;
}
/* reimplement whatever init methods you want to use */
- (id)valueForKey:(id)key;
@end
...
@implementation MyFakeDictionary
- (id)valueForKey:(id)key
{
id val = [theRealDictionary objectForKey:key];
/* etc, as you like */
}
- (id)forwardingTargetForSelector:(SEL)aSelector
{
return theRealDictionary;
}
@end
Так что между MyFakeDictionary и NSMutableDictionary нет отношения наследования, но если вы отправите селектор в MyFakeDictionary, онне понимает (как и любое другое обычное словарное сообщение, кроме того, которое вы заменили), встроенная логика NSObject перенаправит их члену theRealDictionary.Это «имеет», а не «является», с прозрачной пересылкой сообщений, и поэтому удобно устраняет любые проблемы с кластерами классов.