継承とオーバーライド
第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の一種である」のような関係があるときに使います。無関係なクラスを無理に継承関係にすると、かえって設計が分かりにくくなります。