Categories: Cシャープ

C#の継承を基礎から応用まで徹底解説!初心者向けにやさしく学ぶオブジェクト指向

C#はオブジェクト指向プログラミングを強く意識した言語であり、「継承」はその中核をなす重要な機能です。
「既存のクラスを活用しつつ新しい機能を追加したい」「共通のコードを複数のクラスで使い回したい」といったときに役立つのが継承の仕組みです。
この記事では、C#における継承の基本から、実際にコードを書く際のポイント、さらにはよくある注意点や応用的な使い方まで丁寧に解説します。
初心者の方でもわかりやすいよう、図や例を交えて説明していきますので、ぜひ最後までご覧ください。


継承とは何か?〜基本概念の理解〜

「継承(Inheritance)」とは、あるクラス(親クラス、基底クラス)のメンバー(プロパティやメソッド)を別のクラス(子クラス、派生クラス)に引き継ぐ仕組みです。
オブジェクト指向の三大要素の一つであり、「再利用性の向上」や「コードの簡素化」を目的に使われます。

たとえば、「動物」というクラスを作り、それを元に「犬」や「猫」などの具体的なクラスを作ることができます。共通部分は親クラスに書き、子クラスでは個別の機能を追加できます。

// 親クラス
public class Animal
{
public void Eat()
{
Console.WriteLine("食べる");
}
}

// 子クラス
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine("ワン!");
}
}

C#での継承の基本構文

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() メソッドを何も書かなくても使えるようになっています。


オーバーライドとnew:親クラスのメソッドを変更する

継承では、親クラスのメソッドをそのまま使うだけでなく、上書きすることも可能です。これを「オーバーライド(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)」があります。

  • クラスの継承:1つのクラスしか継承できない(単一継承)
  • インターフェース:複数実装が可能(多重継承のように扱える)
public interface IWalkable
{
void Walk();
}

public class Human : IWalkable
{
public void Walk()
{
Console.WriteLine("人が歩く");
}
}

用途に応じて、クラスの継承か、インターフェースの実装かを使い分けましょう。


継承を使うときの注意点

継承は便利な機能ですが、むやみに使うと「柔軟性が失われる」「バグの温床になる」ことがあります。以下の点に注意しましょう。

  • 無理な継承は避け、共通部分が本当にあるかを検討する
  • メソッドをオーバーライドする際は、元の動作を壊さないようにする
  • インターフェースや委譲(デリゲート)の方が適している場合もある

まとめ

C#における継承は、コードの再利用性や可読性を高める強力な手段です。
基本構文からオーバーライド、アクセス修飾子、抽象クラス、インターフェースとの違いまで理解することで、より洗練されたオブジェクト指向の設計が可能になります。

初学者の方は、まずは親クラスと子クラスの関係を簡単なコードで試してみることから始めてみましょう。継承の使いどころを意識しながら実践することで、自然と理解が深まっていきます。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。