理解抽象超类NSNumber

时间:2014-01-08 12:47:18

标签: objective-c

我正在阅读一些关于objective C的书,他们说那里NSNumberabstract superclass我们可以使用的subclasses。{ / p>

所以,“当我们在NSNumber中调用一个方法时,会使用相应的子类”。

我不知道其他一些规则:

如果superclass Asubclass B,并且您在超类A 中调用方法,即子类B ,则为不能这样做 - 因为继承一直在起作用而不是下来。

那么,superclass (abstract) class- NSNumber如何使用其subclass方法?

这里的层次结构是什么?

谢谢。

2 个答案:

答案 0 :(得分:4)

通过class cluster模式完成 来自文件:

  

类集群中的抽象超类必须为其声明方法   创建其私有子类的实例。这是超类   基于的责任分配适当的子类的对象   您调用的创建方法 - 您不会,也不能,选择   实例的类。

每当使用某种工厂方法创建数字时,如+numberWithInt:,工厂将返回具体子类的实例。之后,当您调用-stringValue:之类的内容时,此选择器将被发送到具体NSNumber子类的实例 - 在这种情况下为int。 因此,NSNumber工厂方法实际上不返回NSNumber个对象 - 它们返回具体的子类。其他Cocoa类集群也是如此 - NSArrayNSDictionaryNSSet

答案 1 :(得分:2)

实际上有类NSDoubleNumber,NSLongLongNumber,NSIntegerNumber等(组合名称),你得到合适的一个。但是和所有子类一样,如果你通过它的超类类型调用对象的方法,它将响应,调用适合该实例的特定于类的方法。

Objective-C稍微混淆了一些东西,因为如果你问这个类是什么,它将不会返回“NSDoubleNumber”或者其他什么,而是返回一个基本无意义的整个集群名称,或者它的特定细分。

关键是,您可以将实例视为单个虚构类“NSNumber”的对象,并且永远不必担心您实际拥有哪个子类。

(顺便说一下,NSArray,NSDictionary和其他一些类似的情况也是如此。)