TECH I.S.

C# ポリモーフィズム


ポリモーフィズムとメソッドのオーバーライド

ポリモーフィズムとは「多くの形式」を意味し、継承によって相互に関連するクラスが多数ある場合に発生します。

前の章で指定したように、ポリモーフィズムを使用すると別のクラスからフィールドとメソッドを継承できます。ポリモーフィズムはこれらのメソッドを使用して、さまざまなタスクを実行します。これにより、1つのアクションをさまざまな方法で実行できます。

例えば、animalSound()と呼ばれる基本クラスがあり、Animalと呼ばれるメソッドを持っています。動物の派生クラスには、豚、猫、犬、鳥などがあります。
また、動物の鳴き声(豚の鳴き声、猫の鳴き声など)の独自の実装もあります。

{.language-csharp .techis-white}
class Animal // Base class (parent)
{
  public void animalSound()
{
    Console.WriteLine("The animal makes a sound");
  }
}
class Pig : Animal // Derived class (child)
{
  public void animalSound()
{
    Console.WriteLine("The pig says: wee wee");
  }
}
class Dog : Animal // Derived class (child)
{
  public void animalSound()
{
    Console.WriteLine("The dog says: bow wow");
  }
}

継承の章でクラスから継承する為に、:記号を使用する事を思い出して下さい。

PigDogオブジェクトを作成し、両方のオブジェクトでanimalSound()メソッドを呼び出すことが出来ます。

{.language-csharp .techis-white}
class Animal // Base class (parent)
{
  public void animalSound()
{
    Console.WriteLine("The animal makes a sound");
  }
}
class Pig : Animal // Derived class (child)
{
  public void animalSound()
{
    Console.WriteLine("The pig says: wee wee");
  }基本クラス メソッドをオーバーライドするオプションが用意されています。 }
class Dog : Animal // Derived class (child)
{
  public void animalSound()
{
    Console.WriteLine("The dog says: bow wow");
  }
}
class Program
{
  static void Main(string[] args)
{
    Animal myAnimal = new Animal();  // Create a Animal object
    Animal myPig = new Pig();  // Create a Pig object
    Animal myDog = new Dog();  // Create a Dog object
    myAnimal.animalSound();
    myPig.animalSound();
    myDog.animalSound();
  }
}

出力は次のようになります。

The animal makes a soundThe animal makes a soundThe animal makes a sound

私が求めていた出力ではありません

上記の例の出力は、おそらく期待したものではありませんでした。これは、同じ名前を共有している場合、基本クラスのメソッドが派生クラスのメソッドをオーバーライドするためです。

ただし、C#には、基本クラスのメソッドをオーバーライドするオプションが用意されています。基本クラス内のメソッドにvirtualキーワードを追加し、各派生クラスメソッドにoverrideキーワードを使用する事により、基本クラス メソッドをオーバーライドするオプションが用意されています。

{.language-csharp .techis-white}
class Animal // Base class (parent)
{
  public
<strong>virtual</strong>
void animalSound()
{
    Console.WriteLine("The animal makes a sound");
  }
}
class Pig : Animal // Derived class (child)
{
  public
<strong>override</strong>
void animalSound()
{
    Console.WriteLine("The pig says: wee wee");
  }
}
class Dog : Animal // Derived class (child)
{
  public
<strong>override</strong>
void animalSound()
{
    Console.WriteLine("The dog says: bow wow");
  }
}
class Program
{
  static void Main(string[] args)
{
    Animal myAnimal = new Animal();  // Create a Animal object
    Animal myPig = new Pig();  // Create a Pig object
    Animal myDog = new Dog();  // Create a Dog object
    myAnimal.animalSound();
    myPig.animalSound();
    myDog.animalSound();
  }
}

出力は次のようになります。

The animal makes a soundThe pig says: wee weeThe dog says: bow wow

「継承」と「ポリモーフィズム」を使用する理由とタイミング

- コードの再利用性に役立ちます。新しいクラスを作成するときに、既存のクラスのフィールドとメソッドを再利用します。

プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細