C#継承と多態性マスター:実践コード例で学ぶオブジェクト指向の核心
C#における継承とは
継承はC#オブジェクト指向設計の基盤です。子クラスが親クラスのフィールドとメソッドを自動的に受け継ぎつつ、その振る舞いをオーバーライドまたは拡張することを可能にします。これによりコード再利用が促進され、保守性が簡素化され、明確な階層が確立されます。
- 親クラスと子クラスを定義。
- 子が親のメンバーを継承。
- 子が継承した振る舞いを変更可能。
- 子が独自のメンバーを追加可能。
C#継承の例
以下は継承の実装とprotectedメンバーの使用を示すステップバイステップデモンストレーションです。
ステップ1 - 基底クラスの修正
Tutorial.csを開き、Tutorialクラスの主要フィールドをprotectedに変更:

protectedを使用することで、派生クラスのみがこれらのフィールドに直接アクセス可能になります。
ステップ2 - 派生クラスの作成
基底クラス定義の後に、以下のコードをTutorial.csに追加:

解説:
- コロン(
:)構文でGuru99TutorialをTutorialの子として宣言。 RenameTutorialメソッドを追加し、TutorialNameに新しい値を割り当て。TutorialNameがprotectedのため、Guru99Tutorialは明示的に宣言しなくてもアクセス可能。
ステップ3 - Program.csで派生クラスを使用
Program.csの内容を以下に置き換え:

using System;
namespace DemoApplication {
public class Tutorial {
protected int TutorialID;
protected string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
}
public class Guru99Tutorial : Tutorial {
public void RenameTutorial(string pNewName) {
TutorialName = pNewName;
}
static void Main(string[] args) {
Guru99Tutorial pTutor = new Guru99Tutorial();
pTutor.RenameTutorial(".Net by Guru99");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
解説:
- プログラムは基底
TutorialではなくGuru99Tutorialをインスタンス化。 RenameTutorialを呼び出してタイトルを変更。GetTutorialは基底クラスで定義されているが、派生インスタンスから直接呼び出し可能。
このコードを実行すると:

C#における多態性とは
多態性は、単一のインターフェースで異なる内部形式を表現できるようにします。C#では、メソッドオーバーロードやオーバーライドとして現れ、同じメソッド名がパラメータやコンテキストに基づいて多様なタスクを実行できるようにします。
C#多態性の例
同一クラス内でのメソッドオーバーロードをデモンストレートします。
ステップ1 - 基底クラスの更新
Tutorial.csを以下のように修正:

主な変更点:
SetTutorialメソッドが2つのオーバーロードを持つように - 1つはintとstringを受け取り、もう1つはstringのみ。- 両オーバーロードが対応するフィールドに値を割り当て。
ステップ2 - Program.csでテスト
Program.csを以下のコードに置き換え:
using System;
namespace DemoApplication {
class Tutorial {
public int TutorialID;
public string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public void SetTutorial(string pName) {
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
static void Main(string[] args) {
Tutorial pTutor = new Tutorial();
pTutor.SetTutorial(1, "First Tutorial");
Console.WriteLine(pTutor.GetTutorial());
pTutor.SetTutorial("Second Tutorial");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
解説:
- 最初の呼び出しで
idとnameの両方を2パラメータオーバーロードに渡す。 - 2回目の呼び出しで
nameのみを渡し、単一パラメータオーバーロードを呼び出し。
コンソール表示:

高度なシナリオでは、IDを個別に取得するGetTutorialIDメソッドを追加できます。
まとめ
- 継承により子クラスが親メンバーを継承・拡張可能。
- 多態性、特にメソッドオーバーロードにより、単一メソッド名が異なるパラメータセットに適応。
- 両概念はクリーンで保守しやすく、再利用可能なC#コードに不可欠。
C言語
- C# の式、文、ブロック:実践例で徹底理解
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C++関数を実例で徹底解説:基本から応用まで
- C++ structとclassの違い:構文、特徴、使い分けのベストプラクティス
- while文 vs do-while文:実践例で明確に比較
- C#プログラム構造の理解:コアコンポーネントと例
- C#の継承:再利用可能で保守しやすいコードを構築する
- Python type()とisinstance()の理解:実例付き解説