「仮想関数」を模倣したObjective-Cプロトコルはコンパイラ警告を生成しますか?
-
07-07-2019 - |
質問
Objective-Cでは、デフォルトの実装(親クラスの実装)を提供せずに、派生クラスに特定のインターフェイスを実装するように強制します。
これにはプロトコルを使用できることを理解しており、プロトコルの使用方法は理解していると思いますが、明らかに何かが欠けています...
クラスParentを定義し、親から複数のChildクラスを派生させました。 すべての子クラスは、myMethodの実装を必要とするプロトコルに準拠しています。
Childインスタンスを繰り返し処理し、スーパークラスParentを介してそれらを参照し、それぞれでmyMethodを呼び出します。
コンパイラは、驚くことではないが、ParentがmyMethodに応答しない可能性があることを警告します。
すべての証拠は、派生した子インスタンスごとにmyMethodが実際に呼び出されることを示唆していますが、警告が表示されるという事実は不安になり、これを正しく実装していないことを示唆しています。
不足しているものは何ですか?
ありがとう
解決
これは、プロトコルの使用方法ではありません。プロトコルは、実装されていないインターフェースです。 クラスがプロトコルに準拠していると主張する場合(親クラスは明らかにそうです)、メソッドを実装する必要があります。そうしないと、警告が表示されます。あなたがしたいのは、プロトコルを実際に実装するすべてのクラスに、それらに準拠することを宣言させ、この親クラス名でそれらを参照するのではなく、id<ProtocolNameHere>
として参照することです。これは、それらがそのプロトコルに準拠するオブジェクトであることを宣言します。
他のヒント
私は、プロトコルとその仕組みに多くの関心を寄せています。残念ながら、誤解を招くようなチュートリアルがたくさんあります。
チュートリアルをご覧ください 継承またはプロトコル? プロトコルの仕組みと、継承の代わりにそれらを使用するタイミングについて。多数のサンプルコードと、他の言語の抽象クラスのObjective-Cの類似物としてのカテゴリではなく、プロトコルの使用方法についての説明が含まれています。開発を成功させてください!