【C#】インターフェースと抽象クラスの違い

C# のオブジェクト指向設計では「インターフェース」と「抽象クラス」がよく登場します。どちらも「共通の機能やルールを定義する」仕組みですが、役割や使い方に明確な違いがあります。本記事ではインターフェースと抽象クラスの違いを整理し、使い分けのポイントを解説します。

インターフェースとは?

インターフェースは「機能の契約」を定義する仕組みで、実装は含まずメソッドやプロパティのシグネチャ(名前・引数・戻り値)だけを宣言します。クラスや構造体がインターフェースを「実装」することで、その契約通りにメンバーを提供する必要があります。

interface IMovable
{
    void Move();
}

class Car : IMovable
{
    public void Move()
    {
        Console.WriteLine("車が走ります");
    }
}

class Robot : IMovable
{
    public void Move()
    {
        Console.WriteLine("ロボットが歩きます");
    }
}

インターフェースを使うと、異なるクラスでも同じ操作(Move)を統一的に扱えるようになります。

抽象クラスとは?

抽象クラスは「共通の処理と、派生クラスに任せる処理の両方」を定義できます。共通処理を持たせつつ、実装を子クラスに強制することも可能です。抽象メソッドは abstract を付けて宣言し、子クラスで override して実装します。

abstract class Animal
{
    public string Name { get; set; }

    // 共通メソッド
    public void Eat()
    {
        Console.WriteLine($"{Name} は食事中です");
    }

    // 抽象メソッド(実装は子クラス任せ)
    public abstract void Speak();
}

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine($"{Name} が吠えます:ワンワン!");
    }
}

抽象クラスは「共通処理をまとめたい」かつ「必ず子クラスごとに異なる実装が必要な部分」を強制できる点が特徴です。

インターフェースと抽象クラスの違い

項目 インターフェース 抽象クラス
定義内容 メソッドやプロパティの契約(実装なし) 共通処理と抽象メソッドの両方を定義可能
多重継承 複数実装可能 1つしか継承できない
共通実装 基本的に持てない(C# 8.0 以降はデフォルト実装が一部可能) 共通処理を通常メソッドとして持てる
使いどころ 異なるクラス間で共通の契約を強制したいとき 共通処理をまとめつつ、派生クラスに実装を任せたいとき

使い分けの目安

  • インターフェース: 「こういう機能を必ず持たせたい」という契約を定義したいとき
  • 抽象クラス: 共通のコードを持たせつつ、一部は派生クラスに実装させたいとき

まとめ

インターフェースと抽象クラスは似ているようで目的が異なります。インターフェースは「契約」、抽象クラスは「共通処理+抽象化」と覚えておくと理解しやすいです。設計時には「機能を統一したいのか」「共通の基盤を持たせたいのか」を判断基準にすると、適切に使い分けられるようになります。