我想知道为什么[NSDate distantPast]
和[NSDate distantFuture]
方法的返回类型是 type id
?为什么这些方法不返回NSDate
指针?
问问题
2941 次
4 回答
5
因为多态性仅以一种方式有效。
假设您是 NSDate 的子类,并且您想要覆盖该方法。您必须使用相同的签名,以便使用此签名:
-(NSDate*) distantPast;
但是您将无法将表达式的结果分配给子类类型的指针,并且您需要将结果向下转换:
NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast];
// Downcasting is necessary here, it would give a warning or syntax error otherwise.
即使您确定返回的对象是 NSDate 的子类,您也需要对结果进行向下转换。这就是为什么所有返回创建对象的方法都被声明为返回一个 id。
于 2013-02-08T18:32:46.553 回答
2
NSDate
是一个抽象超类,和distantPast
/或distantFuture
返回 的私有子类NSDate
,而不是NSDate
本身。
于 2013-02-08T17:53:25.523 回答
1
我认为这个问题也像问你应该在一个init
方法上返回什么?一个 id 或指向我们类的指针。
因为在那种情况下它是相同的,你可以认为它是 Apple 对类方法的某种标准化。
于 2013-02-08T17:56:20.173 回答
1
这没有什么特别的原因。另一位发帖人指出,这些方法可能会返回 NSDate 的私有子类,但 NSDate 的子类仍然是 NSDate。我猜这些方法已经足够老了(即 NextStep,在 Mac OS 之前),id 返回类型的原因是历史性的,并且“失传于古代”。(如果您在 Mac OS 文档中查看这些方法,就会发现它们是在 Mac OS 10.0 中定义的)
我敢打赌,老派的方法是到处使用匿名对象指针。
于 2013-02-08T18:12:15.207 回答