継承とは:コードの再利用と拡張
オブジェクト指向プログラミングにおいて「継承(Inheritance)」は、既存のクラス(親クラス)の機能やデータ構造を受け継ぎながら、新しいクラス(子クラス)を定義する仕組みです。
継承を利用することで、共通のフィールドやプロパティ、メソッドを一つのクラスにまとめ、それを複数のクラスで再利用できるため、コードの重複を減らし、保守性を高めることができます。
- 基底クラス(Base Class): 継承元となるクラス。親クラス、スーパークラスとも呼ばれます。
- 派生クラス(Derived Class): 継承して作られる新しいクラス。子クラス、サブクラスとも呼ばれます。
この記事では、C#における継承の基本的な構文と、派生クラスでのメンバー利用について解説します。
継承の基本構文
クラスを継承するには、クラス定義の際にコロン(:)を使用して基底クラスを指定します。
public class 派生クラス名 : 基底クラス名
{
// 派生クラス独自のメンバー
}
派生クラスは、基底クラスで定義されたpublic(およびprotected)なメンバーを自動的に引き継ぎます。
コード例:共通部分の継承
ここでは、ECサイトの商品管理を想定し、全ての商品の基本となるProductクラス(基底クラス)と、それを拡張したDigitalProductクラス(派生クラス)を定義する例を示します。
1. 基底クラスの定義
まず、すべての商品に共通するプロパティ(商品名、価格)を持つProductクラスを定義します。
using System;
/// <summary>
/// すべての商品の基本となるクラス(基底クラス)
/// </summary>
public class Product
{
public string Name { get; set; } = "";
public decimal Price { get; set; }
public void DisplayInfo()
{
Console.WriteLine($"商品名: {Name} | 価格: {Price:C}");
}
}
2. 派生クラスの定義
次に、Productクラスを継承し、デジタル商品特有のプロパティ(ダウンロードURL、ファイルサイズ)を追加したDigitalProductクラスを定義します。
/// <summary>
/// デジタル商品を表すクラス(Productを継承)
/// </summary>
public class DigitalProduct : Product
{
// DigitalProduct 独自のプロパティ
public string DownloadUrl { get; set; } = "";
public double FileSizeMB { get; set; }
}
DigitalProductクラスにはNameやPriceの定義が記述されていませんが、Productを継承しているため、これらのプロパティを持っています。
実行例と動作確認
派生クラスであるDigitalProductのインスタンスを生成し、基底クラスから継承したメンバーと、独自に追加したメンバーの両方を利用します。
using System;
using System.Globalization;
public class InheritanceExample
{
public static void Main()
{
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
// 派生クラス (DigitalProduct) のインスタンスを生成
var ebook = new DigitalProduct
{
// --- 基底クラス (Product) から継承したプロパティ ---
Name = "C# プログラミングガイド (PDF版)",
Price = 3800m,
// --- 派生クラス (DigitalProduct) で追加したプロパティ ---
DownloadUrl = "https://example.com/download/csharp-guide.pdf",
FileSizeMB = 15.5
};
// 基底クラスで定義されたメソッドも呼び出し可能
ebook.DisplayInfo();
// 独自のプロパティへのアクセス
Console.WriteLine($"URL: {ebook.DownloadUrl}");
Console.WriteLine($"サイズ: {ebook.FileSizeMB} MB");
}
}
出力結果:
商品名: C# プログラミングガイド (PDF版) | 価格: ¥3,800
URL: https://example.com/download/csharp-guide.pdf
サイズ: 15.5 MB
「Is-a」関係
継承は「Is-a 関係(…の一種である)」が成り立つ場合にのみ使用するのが適切です。
上記の例では、「デジタル商品(DigitalProduct)は、商品(Product)の一種である」と言えるため、継承関係は適切です。逆に、単に機能を再利用したいだけで、概念的に「一種」と言えない場合は、継承ではなく「コンポジション(クラス内に別のクラスのインスタンスを持つこと)」を検討する必要があります。
まとめ
C#のクラス継承は、: 基底クラス名 という構文で使用します。
- 再利用: 基底クラスで定義した
publicメンバーは、派生クラスで再定義することなくそのまま利用できます。 - 拡張: 派生クラスでは、基底クラスの機能に加えて、独自のプロパティやメソッドを追加できます。
これにより、共通のロジックを一箇所(基底クラス)に集約し、システム全体の一貫性と保守性を向上させることが可能です。
