【C#】クラスの継承(Inheritance):基本クラスのメンバーを派生クラスで再利用する方法

目次

継承とは:コードの再利用と拡張

オブジェクト指向プログラミングにおいて「継承(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クラスにはNamePriceの定義が記述されていませんが、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メンバーは、派生クラスで再定義することなくそのまま利用できます。
  • 拡張: 派生クラスでは、基底クラスの機能に加えて、独自のプロパティやメソッドを追加できます。

これにより、共通のロジックを一箇所(基底クラス)に集約し、システム全体の一貫性と保守性を向上させることが可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次