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関係か)で考えてみてください。
- 「AはBの一種である (is-a)」なら抽象クラス
- 例:犬は動物の一種である →
Animal抽象クラス
- 「AはBができる (can-do)」ならインターフェース
- 例:犬は走ることができる、車も走ることができる →
IMovableインターフェース
実務でのヒント
現代の開発では、インターフェースが好まれる傾向にあります。
理由は、一つのクラスに複数の役割(インターフェース)をパズルのように組み合わせることができ、プログラムの変更に強い柔軟な設計にしやすいからです。


最近のコメント