1

私はプロトコルPを持っています

@protocol P<NSObject>
{

-(void)foo;

@optional

-(void)bar;

}

そして、私にはたくさんのクラスがあります(ダースとしましょう)。これらのクラスはすべてプロトコル P を実装しています。それらの約半分はメソッドbarを実装しており、bar の実装はすべてまったく同じです。

barの実装を共有する最良の方法は何ですか?

明白なアイデア:

1) メソッド bar を実装するいくつかの基本クラスを作成し、他のクラスがそれを継承できるようにします。

実装は簡単です。ただし、私はこのアイデアの大ファンではありません。コードの再利用よりも、エンティティの一般化/仕様を表すクラス階層を好みます。

2) ヘルパーを作成し、bar メソッドを実装する必要があるすべてのクラスから呼び出す

Ok。できます。ただし、バーの実装が小さい場合 (私の場合は数行)、コード自体よりも多くのオーバーヘッド (ヘルパー クラスと各クラスからの呼び出し) が発生します。

他の(より良い)方法はありますか?

4

1 に答える 1

4

クラス間でメソッドの実装を共有するいくつかの方法を次に示します。

  1. 継承。共有メソッドを実装する共通の基本クラスからすべてのクラスを継承させることができます。ただし、たとえば、クラス A を継承する必要がありUIViewController、クラス B を継承する必要がある場合は、これを行うことはできませんNSManagedObject

  2. すべてのクラスで共有される基本クラスにカテゴリを作成します。たとえば、NSObject(事実上) 他のすべてのクラスの基本クラスです。カテゴリを作成してNSObject、すべてのクラスが継承するメソッドを追加できます。これを行う場合は、メソッド名にプレフィックスを付けて、他の名前と競合しないようにする必要があります。たとえば、ronin_fooandronin_barの代わりにfooandを使用しbarます。

  3. ブロックで囲まれていない、メソッドの実装を含むファイルを作成します。@implementation次に、メソッドを必要とする各クラスのブロックの#include真ん中にあるこのファイル。@implementationコンパイラは各クラスのマシン コードのコピーを生成するため、プログラムが大幅に大きくなる可能性があることに注意してください。

  4. 実行時に、Objective-C ランタイム API を使用して、あるクラスから別のクラスにメソッドをコピーします。Objective-C ランタイム プログラミング ガイドObjective-C ランタイム リファレンスの一部を読む必要があります。おそらく、いくつかの例をグーグルで検索する必要もあります。

于 2013-03-12T23:11:52.787 に答える