inheritanceNSMutableDictionary

我想实现一个NSMutableDictionary的子类返回nil而不是在字典中不存在的关键字时抛出一个NSUndefinedKeyException。

但是,当我尝试添加对象到我的字典,我得到

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class 

NilDictionary.h

 @interface NilDictionary : NSMutableDictionary { } @end 

NilDctionary.m

 @implementation NilDictionary - (id)valueForUndefinedKey:(NSString *)key { return nil; } @end 

我真的不得不在我的子类中再次实现NSMutableDictionary的所有方法,还是有一些其他的类我应该inheritance?

澄清 :我最初的问题归咎于我无法正确阅读文档。

如果你需要子类NSMutableDictionary检查出正确的答案。 如果你想要一个当你的键不存在的时候返回nil的字典,NSMutableDictionary已经做到了。

NSMutableDictionary类参考说:

在一个子类中,你必须重写它的两个基本方法:

1. setObject:forKey:
2. removeObjectForKey:

你还必须重写NSDictionary类的原始方法。


NSDictionary类参考说:

如果您确实需要子类NSDictionary ,则需要考虑由Class cluster表示 – 因此,这些方法在概念上基于几个原始方法:

计数
2. objectForKey:
3. keyEnumerator
4. initWithObjects:forKeys:count:

在一个子类中,你必须覆盖所有这些方法。

NSDictionary's其他方法通过调用一个或多个这些基元来操作。 非原始方法提供了一次访问多个条目的便捷方式。


看来你需要重写所有这六个方法来使你的NSMutableDictionary子类工作完美。

这是你的问题。 NSDictionary (及其可变对象)是类集群的一部分(在“类集群”标题下阅读更多关于它们的内容),不应该被分类,因为它会导致问题,比如你所提到的(阅读子类注释在NSDictionary类参考 )。 无论你需要做什么,你将有一种方法来扩展你想要使用的类,以便做你想做的事情。 例如,上面的代码可以很容易地放在一个类别(阅读更多关于类别在这里 )。

你确定在传递“无”KEY(不是值)时你没有得到exception吗?