導入
親クラスのメソッドを、子クラスで上書きして振る舞いを変えられます。これにより「同じSpeak()の呼び出しでも、犬なら『ワン』猫なら『ニャー』」という**多態性(ポリモーフィズム)**が実現します。
図解
flowchart TB
CALL["animal.Speak()<br/>(同じ呼び出し)"] --> V{"実体は?"}
V -->|Dog| D["ワン!"]
V -->|Cat| C["ニャー!"]
style CALL fill:#e8f5e9
サンプル
// 親型の配列に、子オブジェクトを混ぜて入れられる
Animal[] animals = { new Dog(), new Cat() };
foreach (Animal a in animals)
{
a.Speak(); // 実体に応じて Dog/Cat の Speak が呼ばれる
}
// ワン! / ニャー!
class Animal
{
public virtual void Speak() // virtual: 子で上書き可能にする
{
Console.WriteLine("……(動物の鳴き声)");
}
}
class Dog : Animal
{
public override void Speak() // override: 親のメソッドを上書き
{
Console.WriteLine("ワン!");
}
}
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("ニャー!");
}
}
- 親のメソッドに
virtualを付けると、子で上書きできる - 子は
overrideで親のメソッドを上書きする - 親の型で扱っても、実体に応じた振る舞いが呼ばれる=ポリモーフィズム
演習
Shape[] shapes = { new Circle(), new Square() };
foreach (Shape s in shapes)
s.Draw();
// TODO: Shape(Draw → "図形")を親に、Circle(Draw → "円")と Square(Draw → "四角")を
// override で定義してください
___
- 期待される出力:
円四角(2行)
ヒント1を見る
親のDrawにvirtual、子でoverrideします
ヒント2を見る
class Shape { public virtual void Draw() { Console.WriteLine("図形"); } } class Circle : Shape { public override void Draw() { Console.WriteLine("円"); } } class Square : Shape { public override void Draw() { Console.WriteLine("四角"); } }
まとめ
virtual(親)+override(子)でメソッドを上書きできる- 同じ呼び出しでも実体に応じた振る舞いになる=多態性
- 親型でまとめて扱いつつ、個別の振る舞いを引き出せる
次回: 実装を持たない設計の骨組み「抽象クラス」です。