0

複数の初期化メソッドに新しい引数を追加する便利な方法を探しています。説明するのは少し難しいですが、私の問題は次のとおりです。

さまざまな初期化メソッドを実装するクラス ウィッチがあります。フェ

@interface Circle {
    CGPoint   center;
    float   radius;
}
- (id)initWithCenter:...radius:...;
- (id)initWithRect:...;  
- (id)initWithPoly:...;

ここで、クロスヘア クラスをサブクラスとして作成します。したがって、インスタンス変数としていくつかの行を追加したいと思います。問題は、すべての crosshair-object を特定の値で初期化する必要があることですが、もちろん、円を初期化する方法は変更されません。そのため、スーパークラスのすべての init-method が必要ですが、それらの特定の引数をそれぞれに追加します。

(経験の浅い私の目には)直接的な方法は、魔女の各メソッドを上書きしてから、それに応じたスーパーメソッドを呼び出し、その後自分のことを行うことです。しかし、10 個以上の init メソッドがあり、それぞれに同じ引数を追加したい場合、これは非常に面倒です。それで、これを達成するためのより良いアプローチがあるかどうか尋ねていますか?スーパークラスを変更する機能がある場合とない場合があります。

どうもありがとう

4

1 に答える 1

1

通常、指定された初期化子init*である 1 つのメソッド バリアントがあります。他のすべてのメソッドはそのメソッドを呼び出して、必要なカスタマイズを行います。通常、サブクラス化プログラムは、最初に指定されたイニシャライザを呼び出す新しいバリアントを追加するか指定されたイニシャライザ (および必要に応じてその他) をオーバーライドします。init*init*[self init*]

ただし、これは急速に完全に手に負えなくなる可能性があります。あなたの Circle では、次のことが本当に必要なようです

- (id)initWithCenter:...radius:...;

そして、他のタイプを処理する一連の便利なファクトリ メソッドを作成します。

+ circleInRect:...;

(あなたのコードは不自然な例だと思います。そうでなければ、「十字」クラスが「円」クラスのサブクラスであるという奇妙さを指摘します。そのようなものについては、おそらくShapeクラスから始めるでしょう。次に and を Shape のサブクラスとして追加CircleCrosshairます。明らかに、このSketch例は非常に関連性があります。)

于 2010-07-11T03:18:08.270 に答える