C# 継承をマスターする:概念、種類、実践コード
C# 継承を完全解説
このガイドでは、C# における継承の基礎、そのさまざまな形態、実践的なコード例をカバーします。
C# の継承では、既存のクラスから新しいクラスを派生させ、親(基底)と子(派生)の関係を形成します。このオブジェクト指向プログラミング(OOP)の強力な機能は、コードの再利用と論理的な構造化を促進します。
基底クラスはフィールド、プロパティ、メソッドを提供し、派生クラスはそれらを継承して共有ロジックを一箇所に保ちながら、振る舞いを拡張またはカスタマイズできます。
C# での継承宣言
C# ではコロン (:) で継承を示します:
class Animal {
// フィールドとメソッド
}
// Dog が Animal を継承
class Dog : Animal {
// Animal のフィールドとメソッド
// Dog 独自のフィールドとメソッド
}
ここでは Dog が Animal を拡張し、そのメンバーにアクセスできます。以下の図は関係を示しています。

例:基本的な継承
using System;
namespace Inheritance {
// 基底クラス
class Animal {
public string name;
public void Display() {
Console.WriteLine("I am an animal");
}
}
// 派生クラス
class Dog : Animal {
public void GetName() {
Console.WriteLine("My name is " + name);
}
}
class Program {
static void Main(string[] args) {
Dog labrador = new Dog();
labrador.name = "Rohu";
labrador.Display();
labrador.GetName();
Console.ReadLine();
}
}
}
出力
I am an animal My name is Rohu
この例では Dog が Animal から name フィールドと Display() メソッドを継承しています。派生クラスは GetName() など独自のメンバーも追加できます。
「is-a」関係
継承は「is-a」関係を表します。あるクラスが別のクラスの特殊化である場合に使用します。
- Dog is an Animal
- Apple is a Fruit
- Car is a Vehicle
これらの関係が Dog から Animal、Apple から Fruit、Car から Vehicle への派生を正当化します。
継承における protected メンバー
フィールドやメソッドを protected で宣言すると、自身のクラスとすべての派生クラスからアクセス可能になりますが、外部コードからは隠蔽されます。
例:protected メソッドの使用
using System;
namespace Inheritance {
class Animal {
protected void Eat() {
Console.WriteLine("I can eat");
}
}
class Dog : Animal {
static void Main(string[] args) {
Dog labrador = new Dog();
labrador.Eat();
Console.ReadLine();
}
}
}
出力
I can eat
Eat() が protected なので Dog クラスから呼び出せますが、階層外のコードからはアクセスできません。
継承の種類
継承はいくつかのパターンで現れます:
1. 単一継承
1 つの派生クラスが 1 つの基底クラスから継承します。

2. 多段階継承
基底クラスから派生し、さらにその派生クラスから別のクラスが派生する連鎖です。

3. 階層的継承
複数の派生クラスが同じ基底クラスを共有します。

4. 多重継承
C# は複数のクラスからの継承をサポートしませんが、インターフェースにより同様の振る舞いを柔軟に実現できます。

5. ハイブリッド継承
多段階と階層的など、2 つ以上の継承タイプの組み合わせです。

メソッドオーバーライド
基底クラスのメソッドが virtual でマークされ、派生クラスが同じシグネチャで override を使用して再定義すると、ポリモーフィックな振る舞いが可能になります。
using System;
namespace Inheritance {
class Animal {
public virtual void Eat() {
Console.WriteLine("I eat food");
}
}
class Dog : Animal {
public override void Eat() {
Console.WriteLine("I eat dog food");
}
}
class Program {
static void Main(string[] args) {
Dog labrador = new Dog();
labrador.Eat();
}
}
}
出力
I eat dog food
Dog の Eat() が Animal のものをオーバーライドします。virtual がオーバーライドを許可し、override が置き換えを示します。
base キーワードの使用
オーバーライドメソッドから基底クラスの実装を呼び出したい場合があります。base キーワードでこれを実現します。
例:基底メソッドの呼び出し
using System;
namespace Inheritance {
class Animal {
public virtual void Eat() {
Console.WriteLine("Animals eat food.");
}
}
class Dog : Animal {
public override void Eat() {
base.Eat();
Console.WriteLine("Dogs eat dog food.");
}
}
class Program {
static void Main(string[] args) {
Dog labrador = new Dog();
labrador.Eat();
}
}
}
出力
Animals eat food. Dogs eat dog food.
base.Eat() が Animal の実装を呼び出し、その後派生クラスのロジックが実行されます。
C# における継承の重要性
継承は関連クラス間で再利用可能なロジックを可能にします。周長計算で共通の公式を共有する幾何学図形を考えます。
- RegularPolygon 基底クラスに CalculatePerimeter() メソッドを作成。
- Square と Rectangle を派生させ、Length や Sides など固有のプロパティを追加。
- 各派生クラスで独自の面積計算を実装しつつ、周長ロジックを再利用。
説明例
using System;
namespace Inheritance {
class RegularPolygon {
public void CalculatePerimeter(int length, int sides) {
int result = length * sides;
Console.WriteLine("Perimeter: " + result);
}
}
class Square : RegularPolygon {
public int Length = 200;
public int Sides = 4;
public void CalculateArea() {
int area = Length * Length;
Console.WriteLine("Area of Square: " + area);
}
}
class Rectangle : RegularPolygon {
public int Length = 100;
public int Breadth = 200;
public int Sides = 4;
public void CalculateArea() {
int area = Length * Breadth;
Console.WriteLine("Area of Rectangle: " + area);
}
}
class Program {
static void Main(string[] args) {
Square s1 = new Square();
s1.CalculateArea();
s1.CalculatePerimeter(s1.Length, s1.Sides);
Rectangle t1 = new Rectangle();
t1.CalculateArea();
t1.CalculatePerimeter(t1.Length, t1.Sides);
}
}
}
出力
Area of Square: 40000 Perimeter: 800 Area of Rectangle: 20000 Perimeter: 400
このパターンは、継承が重複を減らし保守性を高めることを示しています。
C言語
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# アクセス修飾子を理解する:public、private、protected、internal など
- C# static キーワード:静的変数、メソッド、クラスをマスターする
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 入れ子クラスを理解する:定義、使用法、継承
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
- C++データ抽象化完全マスター:インターフェースと実装の分離
- C#プログラム構造の理解:コアコンポーネントと例
- C#基礎:基本構文とオブジェクト指向概念をマスター