👆️インターフェースと抽象クラスの違い[C#]

interface&abstract C#

C#を学び始めたばかりの方にとって、「インターフェース」「抽象クラス」はどちらも「メソッドの型だけ決めて、中身は後で書く」という似た性質を持っているため、混乱しやすいポイントです。

この記事では、この2つの違いと、現場でどう使い分けるべきかを分かりやすく解説します。


結論:使い分けのポイント

ざっくり一言で言うと、使い分けの基準は以下の通りです。

  • 抽象クラス:「種類(~は~の一種である)」を定義する。
  • インターフェース:「能力・機能(~ができる)」を定義する。

1. 抽象クラス (Abstract Class)

抽象クラスは、共通の性質を持つクラスたちの「共通の土台(ベース)」を作るために使います。

特徴

  • abstract キーワードを使って宣言する。
  • 共通の「中身があるメソッド」も書ける。
  • 1つのクラスは、1つの抽象クラスしか継承できない。

コード例:動物(Animal)

すべての動物に共通する「名前」や「寝る」という動作を共通化する例です。

C#
// 抽象クラス:動物という「種類」の共通ルール
public abstract class Animal
{
    public string Name { get; set; }

    // すべての動物で共通の動作(中身を書ける)
    public void Sleep()
    {
        Console.WriteLine($"{Name}は眠っています。Zzz...");
    }

    // 種類によって違う動作(中身は子クラスで自由に決めてもらう)
    public abstract void MakeSound();
}

// 継承して使う
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("ワンワン!");
    }
}

2. インターフェース (Interface)

インターフェースは、そのクラスが「何ができるか」という契約(約束)を定義するために使います。

特徴

  • interface キーワードを使って宣言する。
  • メソッドの「名前」や「引数」などのルールだけを書く。
  • 1つのクラスに、複数のインターフェースを実装できる。

コード例:動けるもの(IMovable)

「犬」も「車」も動きますが、全く別の種類です。このように、種類をまたいで共通の機能を持たせたい時にインターフェースが便利です。

C#
// インターフェース:「動く」という「能力」の約束
public interface IMovable
{
    void Move(); // 「Moveというメソッドを必ず実装してね」という約束
}

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

// 犬は「動物」であり、同時に「動く能力」も持っている
public class Dog : Animal, IMovable
{
    public override void MakeSound() => Console.WriteLine("ワン!");

    public void Move()
    {
        Console.WriteLine("犬がトコトコ歩きます。");
    }
}

3. 違いのまとめ

特徴抽象クラスインターフェース
役割同じ種類のものの「土台」違う種類でも持てる「機能」
継承/実装数1つだけしか継承できないいくつでも実装できる
メソッドの中身書くことができる基本的に書かない(定義のみ)
フィールド(変数)持てる持てない

4. どう使い分ければいい?

迷ったときは、以下の基準(is-a関係か、can-do関係か)で考えてみてください。

  1. 「AはBの一種である (is-a)」なら抽象クラス
  • 例:犬は動物の一種である → Animal 抽象クラス
  1. 「AはBができる (can-do)」ならインターフェース
  • 例:犬は走ることができる、車も走ることができる → IMovable インターフェース

実務でのヒント
現代の開発では、インターフェースが好まれる傾向にあります。
理由は、一つのクラスに複数の役割(インターフェース)をパズルのように組み合わせることができ、プログラムの変更に強い柔軟な設計にしやすいからです。