C#はオブジェクト指向プログラミングを強く意識した言語であり、「継承」はその中核をなす重要な機能です。
「既存のクラスを活用しつつ新しい機能を追加したい」「共通のコードを複数のクラスで使い回したい」といったときに役立つのが継承の仕組みです。
この記事では、C#における継承の基本から、実際にコードを書く際のポイント、さらにはよくある注意点や応用的な使い方まで丁寧に解説します。
初心者の方でもわかりやすいよう、図や例を交えて説明していきますので、ぜひ最後までご覧ください。
「継承(Inheritance)」とは、あるクラス(親クラス、基底クラス)のメンバー(プロパティやメソッド)を別のクラス(子クラス、派生クラス)に引き継ぐ仕組みです。
オブジェクト指向の三大要素の一つであり、「再利用性の向上」や「コードの簡素化」を目的に使われます。
たとえば、「動物」というクラスを作り、それを元に「犬」や「猫」などの具体的なクラスを作ることができます。共通部分は親クラスに書き、子クラスでは個別の機能を追加できます。
// 親クラス
public class Animal
{
public void Eat()
{
Console.WriteLine("食べる");
}
}
// 子クラス
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine("ワン!");
}
}
C#における継承の構文はシンプルで、コロン(:)を使って親クラスを指定します。
class 子クラス名 : 親クラス名
{
// 子クラスのメンバー
}
このように記述することで、親クラスのプロパティやメソッドが子クラスでも利用可能になります。
実際に「乗り物」を例に継承を実装してみましょう。
public class Vehicle
{
public int Speed { get; set; }
public void Run()
{
Console.WriteLine("走行中...");
}
}
public class Car : Vehicle
{
public string Brand { get; set; }
public void Honk()
{
Console.WriteLine("プップー!");
}
}
このように「Car」は「Vehicle」を継承しており、Run()
メソッドを何も書かなくても使えるようになっています。
継承では、親クラスのメソッドをそのまま使うだけでなく、上書きすることも可能です。これを「オーバーライド(override)」といいます。
public class Animal
{
public virtual void Speak()
{
Console.WriteLine("なにかが鳴いた");
}
}
public class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("ニャー");
}
}
このように、virtual
を親に、override
を子に付けることで、処理内容を変更できます。
new
キーワードを使えば、メソッドを隠す(シャドーイングする)こともできますが、これは初心者には少しややこしいので、override
が基本と覚えておくとよいでしょう。
親クラスのメンバーが、どの範囲まで子クラスからアクセスできるかは「アクセス修飾子」によって制御されます。
修飾子 | 子クラスからのアクセス | 説明 |
---|---|---|
public | 可能 | どこからでもアクセス可能 |
protected | 可能 | 継承先のクラスからアクセス可 |
private | 不可 | 親クラス内からのみアクセス可 |
継承で使いたいメソッドやプロパティには、少なくとも protected
以上の修飾子を付けましょう。
親クラスにコンストラクタがある場合、子クラスで base
を使って呼び出すことができます。
public class Person
{
public string Name { get; }
public Person(string name)
{
Name = name;
}
}
public class Student : Person
{
public int Grade { get; }
public Student(string name, int grade) : base(name)
{
Grade = grade;
}
}
base
は親クラスのコンストラクタやメソッドにアクセスするためのキーワードです。
C#では「抽象クラス(abstract class)」という特殊なクラスを定義することができます。抽象クラスは直接インスタンス化できず、必ず継承して使います。
public abstract class Shape
{
public abstract double GetArea();
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
}
抽象クラスを使うと、「枠組み(設計図)だけ決めて、具体的な処理は子クラスに任せる」という設計が可能になります。
C#では、継承とよく似た仕組みに「インターフェース(interface)」があります。
public interface IWalkable
{
void Walk();
}
public class Human : IWalkable
{
public void Walk()
{
Console.WriteLine("人が歩く");
}
}
用途に応じて、クラスの継承か、インターフェースの実装かを使い分けましょう。
継承は便利な機能ですが、むやみに使うと「柔軟性が失われる」「バグの温床になる」ことがあります。以下の点に注意しましょう。
C#における継承は、コードの再利用性や可読性を高める強力な手段です。
基本構文からオーバーライド、アクセス修飾子、抽象クラス、インターフェースとの違いまで理解することで、より洗練されたオブジェクト指向の設計が可能になります。
初学者の方は、まずは親クラスと子クラスの関係を簡単なコードで試してみることから始めてみましょう。継承の使いどころを意識しながら実践することで、自然と理解が深まっていきます。