#10 継承
今回はオブジェクト指向型プログラミングで重要な継承について説明します.まずは継承を使ったコードを見てみましょう.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InheritanceSample
{
class Base
{
public void M()
{
Console.WriteLine("M Method called.");
}
}
class Derived : Base { }
class Program
{
static void Main(string[] args)
{
new Base().M();
new Derived().M();
}
}
}
M Method called.
M Method called.
クラス名の次に:継承したいクラス名
を書くことで継承できる.
継承というのは属性(変数)や操作(関数)の受け継ぎができる機能で,上の例ではDerived
クラスでは定義されていないはずのM
メソッドを使用することができています.これはDerived
クラスがBase
クラスを継承しているのでBase
クラスのメソッドを使うことができるということです.
ちなみに,継承されるクラス(この例ではBase
)のことを,基底クラスや,スーパークラスなどと呼び,継承するクラス(この例ではDerived
)のことを,派生クラスや,サブクラスなどと呼びます.
##抽象クラス
abstract class Base
{
public void Method() { }
public abstract void OverriddenMethod();
}
class Derived : Base
{
public override void OverriddenMethod() { }
}
抽象クラスは自身のインスタンスを作れず,継承されることを前提とするクラスです.メソッドにabstract
修飾子を付けることで,定義だけしてその実装を派生クラスに委譲することができます.
##インターフェース
interface IBase
{
void Method();
}
interface IBase2
{
void Method2();
}
class Derived : IBase, IBase2
{
public void Method() { }
public void Method2() { }
}
インターフェースは,定義したプロパティ(メンバ変数とメソッドが融合したようなもの)やメソッドを,継承したクラスへ強制的に実装させるというものです.インターフェースは上の例の様に多重継承できます.
##使用例
実際に継承を使ってみましょう.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InheritanceSample
{
abstract class Animal
{
public string sound;
public Animal(string sound)
{
this.sound = sound;
}
public void MakeSounds()
{
Console.WriteLine(sound);
}
}
class Dog : Animal
{
public Dog() : base("Bow wow") { }
}
class Cat : Animal
{
public Cat() : base("Meow") { }
}
class Bird : Animal
{
public Bird() : base("Chirp") { }
}
class Program
{
static void Main(string[] args)
{
Animal[] animals = new Animal[] { new Dog(), new Cat(), new Bird() };
foreach (Animal animal in animals)
{
animal.MakeSounds();
}
}
}
}
Bow wow
Meow
Chirp
Dog
クラス,Cat
クラス,Bird
クラスを全てAnimal
型として扱っています.Animal
クラスはMakeSounds
メソッドを持っているので,animals
内の全ての動物を鳴かせることができています.
派生クラスのコンストラクタが呼び出されると,自動的に基底クラスのコンストラクタも呼び出されますが,:Base()
と書くと,基底クラスのコンストラクタを明示的に呼び出すことができます.
次回はポリモーフィズムについて説明します.