2010-12-07 15 views
9

簡単な答えは議定書でしょう。Objective-CのC++純粋仮想関数に相当するものは何ですか?

ObjectCのすべてのメソッドは仮想であると言われているので、ObjCで仮想を言う必要はありません。

この概念を理解することは難しいです。

この質問をより明確に理解するためのコメントはありますか?

ありがとうございます。

+0

http://stackoverflow.com/questions/5222083/implement-a-pure-virtual-method-in-objective-c –

答えて

13

簡単な答えは議定書になります。

シンプルだが間違っている。プロトコルはインタフェース仕様です。これは、オブジェクトが(今は@optionalキーワードを無視して)対応しなければならないメッセージの集合です。

「仮想関数」という用語は、Objective-Cには直接的な対応がありません。 Objective-Cでは、オブジェクトに対して関数を呼び出さず、メッセージを送信します。次に、オブジェクト自体は、メッセージにどのように応答するかを決定します。通常、そのクラスオブジェクト内のメッセージを検索し、関連するメソッドを見つけて呼び出します。これはすべてコンパイル時ではなく、実行時に発生することに注意してください。

メッセージ(または技術用語を与えるための「セレクタ」)とメソッドの間のマッピングは、@implementationから完全に構築されています。 @interfaceのメソッド宣言は、メソッド実装を忘れているかもしれないことを警告するために必要な情報をコンパイラに与えるためのものです。また、オブジェクトがメッセージに実際に応答するかどうかを実行時まで伝えることができないため、警告にすぎません。たとえば、他の人が、見つからないメソッドの実装を提供する既存のクラスにカテゴリを追加したり、クラスがforwardingTargetForSelector:をオーバーライドして他の場所に応答しないメッセージを転送したりする可能性があります。

+0

+1十分に閉じる。 C++オブジェクトのメソッドを、そのオブジェクトにメッセージを送信するものとして見ることはできますが、メッセージのバインドは実行時ではなくコンパイル時に行われます。 –

+1

@Martin York:投票に感謝します。はい、あなたはC++オブジェクトの関数をメッセージを送るものとして呼び出すことができますが、実際にはそうではありません。Objective-Cには当てはまりますが、そうするのは便利です。 – JeremyP

+1

OOの創始者はあなたとそこに同意しないと思います。それはまさにメソッド(オブジェクトへのメッセージ)の概念です。 C++とObj-Cの重要な違いは、呼び出しを実際のメソッドにバインドすることだけです。 C++はコンパイル時に実行されます。Obj-Cは実行時に行われます(これが唯一の違いです)。 OO-Pに関する関連文献の良い要約をここに見つけることができます。 http://en.wikipedia.org/wiki/Object-oriented_programming –

2

Objective-Cのオブジェクトのメソッドは仮想関数ではなく、実際の関数です。

Obj-Cのメソッドが異なると思うのですが、期待するようなものではありません。 Objective-Cで '純粋な仮想'関数を作ることができないという点を除いて、C++ doの仮想関数と同じように動作します。

乾杯、 Raxit

関連する問題