1

これは非常に迅速な回答になると感じています。私は iOS 開発に関する Paul Hegarty のスタンフォード コースを受講していますが、彼はキャスティングについて言及しています。私はJavaの経験がありますが、キャストに遭遇したことはないので、これはキャストに関する一般的な質問かもしれません. オンラインで簡潔な説明を見つけることができないようです。彼が与えるコードは次のとおりです。

@interface Vehicle
- (void)move;
@end
@interface Ship : Vehicle
- (void)shoot;
@end

Ship *s = [[Ship alloc] init];
[s shoot];
[s move];

Vehicle *v = s;
[v shoot];

id obj = ...;
[obj shoot];
[obj someMethodNameThatNoObjectAnywhereRespondsTo];

// I understand up to this far, but it's the casting I'm having difficulty with

NSString *(hello) = @"hello";
[hello shoot];
Ship *helloShip = (Ship *)hello; 
[helloShip shoot];

したがって、最初の行で、hello という名前の NSString へのポインターを作成します。2 行目で、彼は NSString である hello の shot メソッドを呼び出しますが、そのメソッドは存在しないため機能しません。3 行目では、helloShip という Ship オブジェクトへのポインタを作成し、それを何に等しく設定していますか? NSString ポインターがシップ ポインターに変換 (キャスト?) されましたか? その場合、なぜシュートの呼び出しが失敗するのですか?

4

3 に答える 3

4

キャストは、オブジェクトのクラスを実際に変更したり、キャストされたオブジェクト内の何かを再フォーマットしたりしません。

ケーシングはコンパイラに「黙れ! 私が責任者のプログラマーであり、自分が何をしているかを知っている.

それでおしまい。それ以下でもそれ以上でもありません。そうすることで、オブジェクトが送信されたメッセージに十分に対応できることを確認するのはあなたの責任です。

ただし、ARC を使用すると、サンプルはコンパイルされません。クラスとそのオブジェクトは に応答しないため、shootタイプ のオブジェクトに単純に送信することはできません。VehicleVehicleshoot

ARC がなくても、各オブジェクトに任意のメッセージを送信して、オブジェクトが実行時に応答することを期待できます。に割り当てられた (およびキャストされた) オブジェクトvがまだ にShip応答するタイプであるため、サンプル コードはここまで実行されshootます。

NSStringshootあなたが望むものにどれだけ頻繁にキャストしても、決して反応しません。(もちろんNSString、 を実装するカテゴリで拡張しない限りshoot。しかし、それは別のトピックです。)

于 2013-11-10T14:32:39.923 に答える