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");
}
}
継承の章でクラスから継承する為に、:
記号を使用する事を思い出して下さい。
Pig
とDog
オブジェクトを作成し、両方のオブジェクトで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
「継承」と「ポリモーフィズム」を使用する理由とタイミング
- コードの再利用性に役立ちます。新しいクラスを作成するときに、既存のクラスのフィールドとメソッドを再利用します。プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。