7

昨日、同僚が、実装クラスにそのような初期化子を提供するように強制するために、プロトコルで init メソッド (initWith...:(...)) を宣言してはならない理由を尋ねました。私はその質問に非常に驚きました。私の理解では、これはナンセンスです。しかし、決定的な理由は見つかりませんでしたが、プロトコルで init メソッドを宣言すると、実装の柔軟性が低下します。

正当な理由を教えてください。プロトコルに init メソッドが必要な理由とすべきでない理由を教えてください。

ありがとう!

4

2 に答える 2

8

プロトコルでメソッドを定義して、コードが他の人によって実装されたメソッドを呼び出すことができるようにします。あなたとあなたのプロトコルを実装する開発者との間の「契約」は次のようになります。

  • プロトコルを定義し
  • 他の誰かがあなたのプロトコルを実装し、
  • 他の誰かがあなたのプロトコルを実装するオブジェクトを作成し、それをあなたに渡します。
  • 実装を知らなくても、プロトコルのメソッドを呼び出すことができます。

プロトコルのメソッドを呼び出すには、それを実装するオブジェクトのインスタンスが必要です。プロトコルを定義することの要点は、プロトコルを実装するクラスに関する知識をコードから削除することです。取得するクラスがわかっている場合は、プロトコルをスキップして、クラスに直接プログラムすることもできます。ただし、自分の を呼び出したい場合はinit、そのクラスを知っているか、他の誰かが がまだ呼び出されていないalloc-ed オブジェクトを渡さなければなりません。initどちらの選択肢も良い考えではありません.1つ目はプロトコルを持つ目的を殺し、2つ目は呼び出し元が部分的に初期化されたオブジェクトを扱うことを強制します.

プロトコルに非構成メソッドを含めることを妨げるものではないことに注意してくださいinit。特定の情報を使用してすべてのオブジェクトを構成する必要がある場合は、ユーザーに必要なものを何でも実装させ、プロトコルにメソッドをinit追加して、メソッドconfigureWith:...を知らずにオブジェクトを構成するプロセスinit

于 2013-05-29T09:38:55.537 に答える
4

init... メソッドを持つ iOS SDK のいくつかのプロトコルを知っています。たとえば、NSCoding プロトコルには – initWithCoder: 必要なメソッドがあります。通常の練習だと思います。

于 2013-05-29T09:37:44.630 に答える