5

サブクラス化とクラスメソッドについて質問があります。

MyBaseClassコンビニエンスクラスメソッドを持つ基本クラスがあります

+ (id)giveMeAClassUsing:(NSString *)someParameter;

MyBaseClassシングルトンではありません。

ここで、のサブクラスを作成したいと思います。MyBaseClassそれをと呼びましょうMyChildClass。同じクラスメソッドもオンにしたいと思いMyChildClassます。さらに、インスタンス変数を初期化するMyChildClassときにも初期化したいと思います。

このようなことをしますか:

+ (id)giveMeAClassUsing:(NSString *)someParameter {

      MyChildClass *anInstance = [super giveMeAClassUsing:someParameter];
      anInstance.instanceVariable = [[UIImageView alloc] initWithFrame:someFrame];

      return anInstance;
}

有効ですか?

(事前に)すべてのあなたの助けと私の混乱を解決し、いくつかの概念を明確にしてくれてありがとう!

乾杯!

4

2 に答える 2

8

それはうまくいくでしょう。

おそらく、オーバーライドする必要がないように便利なコンストラクターを定義することをお勧めします。

 + (id)myClassWithString: (NSString *)string {
     return [[[self alloc] initWithString:string] autorelease];
 }

これは、どのスーパークラスまたはそのサブクラスで呼び出されても、正しいことを行います。

次に、サブクラスinitWithString:のメソッドだけを変更して、初期化を処理します。

- (id)initWithString: (NSString *)string {
    return [self initWithString:string andImageView:[[[UIImageView alloc] initWithFrame:someFrame] autorelease]] ;
}
于 2012-04-25T18:51:10.607 に答える
5

絶対にそれは有効です。

selfただし、スーパークラスに 1 つの注意点があります。スーパークラスを名前で参照するのではなく、クラス自体を で参照してください。

これは悪いです:

// MySuperClass // BAD :(
+ (id)giveMeAClassUsing:(NSString *)someParameter {
  return [[[MySuperClass alloc] initWithParam:someParameter] autorelease];
}

しかし、これは良いです!

// MySuperClass // GOOD! :D
+ (id)giveMeAClassUsing:(NSString *)someParameter {
  return [[[self alloc] initWithParam:someParameter] autorelease];
}

そうしないと、サブクラス化してから super を呼び出すと、実際には正しいクラスが初期化されません。を使用するとself、クラス メソッドをオーバーライドせずに、インスタンス化されるクラスを変更できます。

于 2012-04-25T18:50:46.520 に答える