← C#

LESSON / ARTICLE

継承とオーバーライド

既存のクラスを継承し、共通部分を再利用しながら振る舞いを拡張する方法を学びます。

継承とオーバーライド

第4章では、クラス・インスタンス・コンストラクター・カプセル化を学びました。このページでは、それらを土台にして、クラス同士に共通点がある場合の設計方法を学びます。

継承は、あるクラスをもとに別のクラスを定義する仕組みです。もとになるクラスを基底クラス、そこから作るクラスを派生クラスと呼びます。

基本的な継承

class Animal
{
    public string Name { get; }

    public Animal(string name)
    {
        Name = name;
    }

    public void Eat()
    {
        Console.WriteLine(

class Animal
{
    public string Name { get; }

    public Animal(string name)
    {
        Name = name;
    }

    public void Eat()
    {
        Console.WriteLine(WTLDL4B_DIRECTIVE_PLACEHOLDER_0quot;{Name} eats.");
    }
}

class Dog : Animal
{
    public Dog(string name) : base(name)
    {
    }

    public void Bark()
    {
        Console.WriteLine("Woof!");
    }
}

class Program
{
    static void Main()
    {
        Dog dog = new Dog("Pochi");
        dog.Eat();
        dog.Bark();
    }
}

quot;{Name} eats."); } } class Dog : Animal { public Dog(string name) : base(name) { } public void Bark() { Console.WriteLine("Woof!"); } } class Program { static void Main() { Dog dog = new Dog("Pochi"); dog.Eat(); dog.Bark(); } }

class Dog : Animal は、DogがAnimalを継承することを表します。DogはAnimalのpublicやprotectedなメンバーを利用できます。base(name)は、基底クラスのコンストラクターを呼び出します。

オーバーライド

派生クラスごとに同じメソッドの振る舞いを変えたい場合、基底クラス側にvirtualを付け、派生クラス側でoverrideします。

class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("...");
    }
}

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof!");
    }
}
  • virtual: 派生クラスで上書きできるメソッドを宣言します。
  • override: 基底クラスのvirtualメソッドなどを上書きします。
  • base: 派生クラスから基底クラスのメンバーを呼び出すときに使います。

継承は、単にコードを短くするためだけの機能ではありません。「DogはAnimalの一種である」のような関係があるときに使います。無関係なクラスを無理に継承関係にすると、かえって設計が分かりにくくなります。