1

我想知道为什么[NSDate distantPast][NSDate distantFuture]方法的返回类型是 type id?为什么这些方法不返回NSDate指针?

4

4 回答 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 回答