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 以降はデフォルト実装が一部可能) | 共通処理を通常メソッドとして持てる |
使いどころ | 異なるクラス間で共通の契約を強制したいとき | 共通処理をまとめつつ、派生クラスに実装を任せたいとき |
使い分けの目安
- インターフェース: 「こういう機能を必ず持たせたい」という契約を定義したいとき
- 抽象クラス: 共通のコードを持たせつつ、一部は派生クラスに実装させたいとき
まとめ
インターフェースと抽象クラスは似ているようで目的が異なります。インターフェースは「契約」、抽象クラスは「共通処理+抽象化」と覚えておくと理解しやすいです。設計時には「機能を統一したいのか」「共通の基盤を持たせたいのか」を判断基準にすると、適切に使い分けられるようになります。