Вопрос наследования - PullRequest
       3

Вопрос наследования

0 голосов
/ 26 августа 2011

Рассмотрим следующие 2 метода:

class A{
  void Method1(){
    if(!something) return;
    DoX();
    DoY();

    DoZ();
}
class B{
  void Method2(){
    if(!something) return;
    DoX();
    DoY();

    DoP();
  }
}

очевидно, что суперкласс может быть написан, чтобы избежать принципа сухости:

class Super{
  virtual void Method(){
    if(!something) return; //problem...
    DoX();
    DoY();
  }
}
class A:Super{
  override void Method(){
    inherited Method();
    DoZ();
  }
}
class B:Super{
  override void Method(){
    inherited Method();
    DoP();
  }
}

Проблема в том, что проверка чека где-то заканчиваетсяв первом примере, тогда как во втором он будет исчерпан из метода суперкласса, но в производном классе выполните либо DoZ (), либо DoP ();

Мой вопрос: как лучше всего решитьтакого рода проблемы?Тот, что приходит мне в голову, делает метод суперкласса функцией, возвращающей bool

 virtual bool Method(){ if(!something) return false;}

 override bool Method(){ if(!inherited Method()) return;}

, это лучший обходной путь?

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Как насчет:

class Super {
    void Method() {
        if (!something) return;

        DoX();
        DoY();

        DoThingy();
    }

    abstract void DoThingy();
}

class A : Super {
    override DoThingy() {
        DoZ();
    }
}

class B : Super {
    override DoThingy() {
        DoP();
    }
}
0 голосов
/ 26 августа 2011

Другой вариант: сохранить проверки в производных методах.Может быть, производному классу может потребоваться немного другое условие?

class Super{
  virtual void Method(){
    DoX();
    DoY();
  }
}
class A:Super{
  override void Method(){
    if(!something) return;
    inherited Method();
    DoZ();
  }
}
class B:Super{
  override void Method(){
    if(!something) return;
    inherited Method();
    DoP();
  }
}
0 голосов
/ 26 августа 2011

Почему бы не объявить другой виртуальный метод для DoP или Doz, вы можете обернуть их, если хотите, чтобы они были общедоступными со своими соответствующими именами.

Как суперкласс:

virtual void wrapping(){};

Тогда каждыйребенок:

void wrapping() { DoP(); }
void wrapping() { DoZ(); }

Не знаю, ясно ли я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...