web-dev-qa-db-ja.com

プロトコルに固執し、同時にサブクラスになりますか?

Objective Cでは、5つのメソッドと4つのプロパティを持つ抽象プロトコル(インターフェース)が必要な状況にありますが、同時に、これら5つのメソッドのうち3つの共通の実装が必要です。

だから私の質問は、それは大丈夫ですか

1)すべてのメソッドとプロパティの宣言を含むインターフェース宣言のみを持ち、

2)そのプロトコルに準拠する(そのインターフェースを実装する)基本クラスを持っているが、それらのクラスの一部の共通実装も提供し、残りのメソッドには空のスタブメソッド実装しかない、そして最後に、

3)そのプロトコルに準拠する(その基本クラスからの)サブクラスの束がありますが、-また、一般的なメソッドの実装を継承し、-独自のスタブメソッドを実装していますか?

3
Earl Grey

これは、Objective Cで abstract classes の欠如に対処するためによく使用されるパターンです。

不完全な実装を確実にキャッチするために、基本実装の欠落しているメソッドスタブが例外を発生させることは非常に一般的です。それが一般的にどのように行われるかの詳細については、 スタックオーバーフローに関するこの回答 を参照してください。

4
dasblinkenlight

ですが、よろしいですか

1)すべてのメソッドとプロパティの宣言を含むインターフェイス宣言のみを持ち、

それを試してみてください。使用するクラスの@implementationセクションがないと(サブクラス化しているだけでも)、エラーが発生することがわかります。クラスごとに@implementationが必要です。

2)そのプロトコルに準拠する基本クラス(そのインターフェースを実装)があるが、それらのクラスの一部の共通の実装も提供し、残りのメソッドには空のスタブメソッド実装のみがある

はい、あなたは確かにそれを行うことができます。サブクラスに強制的にオーバーライドさせる場合は、スタブに例外をスローします。

3)そのプロトコルに準拠する(その基本クラスからの)サブクラスの束がありますが、-共通のメソッド実装も継承します-そして、それら自身のスタブメソッドを実装しますか?

はい、問題ありません。

プロトコルは、実際にはメソッドのセットを指定するための単なる方法です。クラスでプロトコルを採用すると、クラスでそれらのメソッドを提供することを約束しますが、howについて何も約束しません-これらのメソッドが実装されています-コンパイラーは文句を言わないでしょうこれらは、サブクラスでオーバーライドする単なる空のメソッドです。

別の可能性は、問題のプロトコルを採用せずに、基本クラスに共通のメソッドを実装することです。次に、各サブクラスでプロトコルを採用し、基本クラスから継承しないメソッドを実装します。各サブクラスはプロトコルを採用する必要があるため、それは理想的ではないように見えるかもしれませんが、コードの動作方法をより正確に反映する可能性があります。基本クラスはプロトコルを採用せず、サブクラスのみが採用します。基本クラスをインスタンス化して送信する場合は、-conformsToProtocol:メッセージ、NOが返されます。

1
Caleb