[NSDate distantPast]
doと[NSDate distantFuture]
メソッドの戻り値の型がなぜ型なのか疑問に思っていid
ます。NSDate
これらのメソッドがポインターを返さないのはなぜですか?
4 に答える
ポリモーフィズムは一方向にのみ有効だからです。
NSDate をサブクラス化し、そのメソッドをオーバーライドしたいとしましょう。同じ署名を使用する必要があるため、次の署名を使用します。
-(NSDate*) distantPast;
ただし、式の結果をサブクラス型のポインターに代入することはできず、結果をダウンキャストする必要があります。
NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast];
// Downcasting is necessary here, it would give a warning or syntax error otherwise.
返されたオブジェクトが NSDate のサブクラスであることが確実な場合でも、結果をダウンキャストする必要があります。これが、作成されたオブジェクトを返すすべてのメソッドが ID を返すように宣言されている理由です。
これには特別な理由はありません。他の投稿者は、これらのメソッドがNSDateのプライベートサブクラスを返す可能性があることを指摘しましたが、NSDateのサブクラスは依然としてNSDateです。これらのメソッドは十分に古く(つまり、Mac OSより前のNextStep)、id returnタイプの理由は歴史的であり、「古くから失われている」と推測しています。(Mac OSのドキュメントでこれらのメソッドを見ると、Mac OS 10.0で定義されていることがわかります)
古い学校のアプローチは、どこでも匿名オブジェクトポインタを使用することだったに違いありません。
その質問は、init
メソッドで何を返す必要があるかを尋ねるようなものだと思います。クラスへの ID またはポインタ。
その場合も同じであるため、クラス メソッドに関する Apple 側の何らかの標準化であると考えることができます。