2

2 つのサブクラスがあります。Base から継承する SubA と SubB。

サブクラスには同じメソッド SubMethodA があります。このメソッドは、両方のサブクラスに対してまったく同じ方法で記述されます。その違いは実行にあります。SubMethodA 内で、サブクラスに応じて異なる方法で実行される SubMethodB を呼び出します。

SubMethodA を Base に移動できると考えましたが、もちろん Base は SubMethodB について知りません。

• 最初の試行: SubMethodA のプロトタイプとその実装を Base クラスに追加しました。次に、SubMethodB のプロトタイプを Base のインターフェイスに追加しました。Base の実装では、SubMethodB を空のスタブとして実装しました。これにより、サブクラスへの「パススルー」が可能になります。サブクラスは SubMethodB をオーバーライドします。これは機能しましたが、何かがおかしいと感じました。これを機能させるためだけに空のスタブを用意するのは正しくありません。理由はわかりませんが、私の内なるプログラマーは満足していませんでした。

• 2 回目の試行: Base ヘッダーに SubMethodB プロトタイプを残しました。空のスタブを削除したところ、もちろん「実装が不完全です」という警告が表示されました。正しくコンパイルおよび実行されますが、正しくありません。

• 3 回目の試行: Base ヘッダーからプロトタイプを削除しました。最後の警告はなくなりましたが、新しい警告が表示されました。「インスタンスメソッド '-SubMethodB:' が見つかりません (戻り型のデフォルトは 'id')」. 繰り返しますが、警告は意味があり、コードは適切に実行されますが、これは正しくありません。

• 4 回目の試行: 両方のサブクラスによって実装される「BaseProtocol」という @protocol を作成しました。サブAとサブB。前回の試行と同じ警告がまだあります。

• 5 回目の試行: 最後の試みとして、問題のあるコードを "[self conformsToProtocol:@protocol(BaseProtocol)]" で囲み、このメソッドが実際にサブクラス化して警告を表示しませんが、違いはありませんでした。前回と同じ予告。

だからここに私の質問があります:

  • サブクラスのメソッドを呼び出す基本クラスのこの考えは夢物語ですか、それとも警告なしでこれを適切に実行できる方法はありますか?
  • 基本クラスの 2 つのサブクラスにあるのとまったく同じコードを持ちたいという私の思考パターンは間違っていますか?

ヘルプ、洞察、または提案をいただければ幸いです。

4

2 に答える 2

0

警告について:

プロトコルにはオプションのメソッドを含めることができます。これにより、不完全な実装の警告が削除されます。

デザインについて:

あなたが行おうとしている設計は、Objective-C の一般的な設計パターンとは異なります。継承はかなり珍しいものです。代わりに、委任は実装をカスタマイズするためによく使用されます。メソッドがあなたが言うように似ている場合は、delegateA と delegateB が何が起こるかを変更する場所を見つけることができるかもしれません。おそらく、「基本」クラス(サブクラスがなくなったため引用符で囲まれている)には、delegateAとdelegateBがコードブロックを送信して、methodA内の異なるポイントで実行できるAPIを持つことができます

于 2012-06-26T20:35:32.817 に答える
0

SubMethodA を Base クラスに配置します。次に、各サブクラスで SubmethodA をオーバーライドします。オーバーライドでは、[super SubMethodA] を呼び出してから、好きな方法で SubmethodB を追加します。

于 2012-06-26T20:38:57.093 に答える