0

私がクラスの動物と動物を継承するクラスの犬を持っているとしましょう。犬に固有の「eat()」というメソッドを呼び出したいが、すべての動物間で共有のeatコードがあるため、「eat()」を仮想化できることはわかっていますが、基本クラスコード、たとえば、基本クラス'eatAll()'を呼び出すだけで、特定の動物のすべてのeatメソッドがそれを呼び出す必要がありますか?私が推測する最高のデザインを探しているだけです。これはC++です

4

3 に答える 3

5

これは古典的なテンプレートメソッドパターンです。基本的に:

class Animal
{
    void Eat() 
    {
       //stuff specific to all animals

       SpecificEat();
    }
    virtual void SpecificEat() = 0;
};

class Dog : Animal
{
    virtual void SpecificEat()
    {
        //stuff specific to dog
    }
};

このアプローチを使用すると、派生クラスのオーバーライドで基本クラスメソッドを明示的に呼び出す必要はありません。非によって自動的に呼び出されvirtual Eat()、特定の機能はによって実装されvirtual SpecificEat()ます。

于 2012-10-09T19:35:47.627 に答える
4

基本クラスのインターフェースには、派生型の特定の機能を呼び出すためのフックがあることをお勧めします。これは、テンプレートメソッドパターンと呼ばれます。 次に例を示します。

class Animal
{
public:
   void eat()
   {
      std::cout << "Mmmm... It's ";
      do_eat();
   }

private:
   virtual void do_eat() = 0;
};

class Dog
   : public Animal
{
   virtual void do_eat()
   {
      std::cout << "Dog Food!\n";
   }
};

class Human
   : public Animal
{
   virtual void do_eat()
   {
      std::cout << "Pizza!\n";
   }
};
于 2012-10-09T19:36:37.207 に答える
2

基本クラスのメソッドを呼び出すだけです。

class Dog : public Animal
{
public :
  void Eat()
  {
    // .. MAGIC
    Animal::Eat();
  }
};

AnimalクラスのEatメソッドが純粋な仮想である場合(これは疑わしいです)、これはリンクされないことに注意してください。

于 2012-10-09T19:35:26.093 に答える