抽象クラスとは?
抽象クラスとは、
「継承されることを前提とした設計用のクラス」 です。
つまり、自分だけでは完全な形になっていないクラス。
C#では abstract キーワードを使って定義します。
abstract class Animal
{
public abstract void Speak(); // 抽象メソッド(中身がない)
public void Eat()
{
Console.WriteLine("食べています");
}
}
上の例では、Animal クラスは「動物」というざっくりした存在。
動物には「食べる(Eat)」という共通の動作はあるけど、
「鳴く(Speak)」は動物ごとに違います。
だから Speak() の中身は書かずに「抽象メソッド」として宣言しておくわけです。
抽象クラスを継承して使う
抽象クラスは そのままインスタンス化できません。
必ず「具体的な子クラス」を作ります。
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("ワンワン!");
}
}
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("ニャー!");
}
}
使うとき
Animal dog = new Dog();
dog.Speak(); // ワンワン!
dog.Eat(); // 食べています
Animal は抽象的な存在ですが、
Dog や Cat がその「具体的な中身」を埋めてくれるわけです。
抽象クラス vs インターフェース
抽象クラスと似た存在に「インターフェース」があります。
| 項目 | 抽象クラス | インターフェース |
|---|---|---|
| 継承できる数 | 1つまで | 複数実装OK |
| フィールド | 持てる | 持てない(定数以外) |
| 共通処理の実装 | 可能 | 基本的に不可(C#8以降はdefault実装OK) |
| 目的 | 基本設計の共有 | 約束(仕様)の定義 |
- 抽象クラス:共通処理を含む「ベースクラス」を作りたいとき
- インターフェース:異なるクラス間で「同じ機能を保証」したいとき
まとめ
| 要点 | 内容 |
|---|---|
| 抽象クラス | 継承前提のクラス |
| 抽象メソッド | 子クラスで必ず実装が必要なメソッド |
| 使い道 | 共通処理+個別処理をまとめたいとき |
| インスタンス化 | 不可(必ず継承して使う) |
抽象クラスは、
「共通点はまとめたいけど、違う部分もある」
というときに便利です。