0

ベースクラスBaseClassから継承するサブクラスSubClassがあります。

BaseClassには、次のような初期化子があります。

-(id)init {
    self = [super init];
    if(self) {
       [self commonInit];
    }
  return self;
 }

 -(void)commonInit {
     self.goodStuff = [[NSMutableArray alloc]init];
 }

SubClassは、次のように初期化子を実行します。

-(id)init {
    self = [super init];
    if(self) {
       [self commonInit];
    }
  return self;
 }

 -(void)commonInit {
     self.extraGoodStuff = [[NSMutableArray alloc]init];
 }

今、私は*適切なObjective-Cコースを受講したことがありませんが、私は電気工学側のプログラマーなので、受講します。私は主にJavaでサーバー側アプリケーションを開発したので、Javaの原則を通してOOの世界を見ているかもしれません。

SubClassが初期化されると、BaseClass initが呼び出されます。私の期待は、BaseClassの特性がSubClassに渡されることを意味するため、BaseClassのcommonInitメソッドがBaseClassinit中に呼び出されることです。

そうではない。私は*sortaは、おそらく-おそらく-私の想像力を伸ばすことができない理由を理解することができます。しかし、それでは、なぜそれはOOPの原則に基づいていないのでしょうか。実行中のコードのクラスのインスタンスでない場合、「自己」は何を表しますか?

そうですね—Objective-Cの十分に開発されたエディションが行っていることが間違っていると主張するつもりはありません。では、この場合に使用する必要があるパターンは何ですか?SubClassには2つの主要なビットが必要です。BaseClassにあるgoodStuffと、それに値するextraGoodStuffです。

明らかに、私はこのタイプの状況で間違ったパターンを使用してきました。commonInitを公開するつもりですか(カプセル化の原則について疑問に思います。少なくともJavaの世界では「保護されている」と見なされ、インスタンスごとに1回だけ呼び出されるものを公開するのはなぜですか)。

私は最近、同様の問題に遭遇し、それをいじくりまわそうとしましたが、今は、私の原則と概念がすべて頭の中にまっすぐにあるのかどうか本当に疑問に思っています。

少し助けてください。


はっきりさせておきますが、superでinitを呼び出すと、自己がサブクラスになってしまうことがわかります。デバッグするときなどに見えること。

このような状況でメソッドをオーバーライドするためのパターンは何ですか?スーパークラスのいくつかのinitメソッドから呼び出される可能性のある一般的な初期化が少しありますか?initのすべてのバリエーションにコードを配置する必要がありますか?

4

2 に答える 2

3

selfこれらはメモリ位置へsuperの単なるポインタであり、オブジェクトが割り当てられているのと同じアドレスを指しますが、Objective-Cコンパイラによって特別に扱われます。

super最初のスーパータイプで過負荷解決を開始します。親タイプ(BaseClassこの場合)。

selfポインタが指す現在の実行時タイプで過負荷解決を開始します。を指すので、からBaseClass commonInit呼び出すことができないのはそのためです。これを実行したい場合は、incallが必要です。BaseClassselfSubClasscommonInitSubClass[super commonInit]

于 2012-12-15T17:10:46.730 に答える
1

selfこの例のBaseClass'コンストラクターはタイプSubClassであるため、'commonInitメソッドではなく'commonInitオーバーライドを[self commonInit]呼び出します。SubClassBaseClass

于 2012-12-15T17:09:32.947 に答える