0

Objective-cでは、特定のメソッドがその(呼び出し元の)子によって上書きされた場合、スーパークラスでどのように判断できますか?

たとえば、以下では、子クラスZはメソッドbをオーバーライドしないため、基本クラスXは追加のデフォルト処理を実行します。ただし、ZYは子クラスYにbを実装するため、デフォルトの処理は必要ありません。

// base class X
-(void)a
{
   // do something
}

-(void)b
{
   if("no_child_has_implemented_b") {
      // add some default behavior
   }
}


// child class Y : X
-(void)a 
{
   [super a];
}

-(void)b
{
   [super b];
}


// child class Z : X
-(void)a
{
   [super a];
}

// child class ZY : X
-(void)a
{
   [super a];
}
4

2 に答える 2

3

妥当な通常のオブジェクト指向設計では、サブクラスがそれをオーバーライドしているかどうかを基本クラスに知らせてはなりません。あなたがそれをしていることに気付いた場合、それはコードの臭いであり、通常、物事を行うためのより良い方法があることを意味します。

スーパークラスがサブクラスの動作と意図を2番目に推測していることを意味するため、オーバーライドされているかどうかに基づいてスーパークラスのメソッドの動作を変更することは、ほとんどの場合お勧めできません。たとえば、ある日、あなたが考えもしなかった理由で、誰かがスーパークラスによって提供されるデフォルトのセットアップを取得したいサブクラスを作成した場合はどうなりますか?

サブクラスのオーバーライドされたメソッドがスーパーバージョンを呼び出すことは非常に定期的であり、スーパーバージョンはそのクラスに関連する基本的なセットアップを行い、サブクラスのオーバーライドされたメソッドはスーパーを呼び出した後に追加の処理を実行します。これで状況が処理されない場合は、サブクラスのメソッドがスーパーバージョンのメソッドを呼び出さないようにすることができます。つまり、独自のコードを実行するだけです。

于 2012-08-03T16:21:06.537 に答える
0

スーパークラス(サンプルとしてBOOL型)に変数を追加して、基本クラスのinitで定義し、子クラスのinitで再定義できます。したがって、メソッドが子クラスから呼び出されたかどうかをいつでも判断できます。

于 2014-03-19T10:36:21.590 に答える