我正在阅读一些关于objective C
的书,他们说那里NSNumber
是abstract
superclass
我们可以使用的subclasses
。{ / p>
所以,“当我们在NSNumber
中调用一个方法时,会使用相应的子类”。
我不知道其他一些规则:
如果superclass A
,subclass B
,并且您在超类A 中调用方法,即子类B ,则为不能这样做 - 因为继承一直在起作用而不是下来。
那么,superclass (abstract) class- NSNumber
如何使用其subclass
方法?
这里的层次结构是什么?
谢谢。
答案 0 :(得分:4)
通过class cluster模式完成
来自文件:
类集群中的抽象超类必须为其声明方法 创建其私有子类的实例。这是超类 基于的责任分配适当的子类的对象 您调用的创建方法 - 您不会,也不能,选择 实例的类。
每当使用某种工厂方法创建数字时,如+numberWithInt:
,工厂将返回具体子类的实例。之后,当您调用-stringValue:
之类的内容时,此选择器将被发送到具体NSNumber
子类的实例 - 在这种情况下为int。
因此,NSNumber
工厂方法实际上不返回NSNumber
个对象 - 它们返回具体的子类。其他Cocoa类集群也是如此 - NSArray
,NSDictionary
,NSSet
。
答案 1 :(得分:2)
实际上有类NSDoubleNumber,NSLongLongNumber,NSIntegerNumber等(组合名称),你得到合适的一个。但是和所有子类一样,如果你通过它的超类类型调用对象的方法,它将响应,调用适合该实例的特定于类的方法。
Objective-C稍微混淆了一些东西,因为如果你问这个类是什么,它将不会返回“NSDoubleNumber”或者其他什么,而是返回一个基本无意义的整个集群名称,或者它的特定细分。
关键是,您可以将实例视为单个虚构类“NSNumber”的对象,并且永远不必担心您实际拥有哪个子类。
(顺便说一下,NSArray,NSDictionary和其他一些类似的情况也是如此。)