interfaceとabstractの違いとは?初心者向けに使い分けを分かりやすく解説
結論として、interface(インターフェース)は「できること(ルール・契約)」を定義するもの、abstract(抽象クラス)は「共通の機能を持つ親クラス」です。
どちらもオブジェクト指向でよく使われる仕組みですが、目的が異なります。初心者は「継承に使うもの」とまとめて覚えがちですが、何を共有したいのかを考えると使い分けが分かりやすくなります。
interfaceとabstractとは?
interfaceとは
interface(インターフェース)は、クラスが実装しなければならないルール(契約)を定義するものです。
「この機能を持つクラスなら、必ずこのメソッドを実装してください」という約束を決めます。
| 特徴 | 内容 |
|---|---|
| 目的 | ルール・契約を定義する |
| インスタンス化 | できない |
| 継承 | 複数実装できる(Java・C#) |
| 主な用途 | 共通の機能を保証する |
abstractとは
abstract(抽象クラス)は、共通の機能やデータを持つ親クラスです。
子クラスで共通利用する処理を実装しつつ、一部の処理だけ子クラスごとに実装を任せることができます。
| 特徴 | 内容 |
|---|---|
| 目的 | 共通処理をまとめる |
| インスタンス化 | できない |
| 継承 | 通常は1つだけ継承できる |
| 主な用途 | 共通機能を持つ親クラス |
イメージで理解する
| 例 | interface | abstract |
|---|---|---|
| 運転免許証 | 「運転できる」という資格 | × |
| 車 | × | 共通機能を持つ親クラス |
例えば、「運転できる」という資格は車でもバイクでも持てます。これはinterfaceのイメージです。
一方、「車」という親クラスにはエンジンやタイヤなど共通の機能があります。これはabstractクラスのイメージです。
アクセス範囲と役割の違い
| 比較項目 | interface | abstract |
|---|---|---|
| 共通処理を持てる | 一部可能(Java 8以降、C# 8以降) | 〇 |
| メンバー変数を持てる | 基本的に定数のみ | 〇 |
| コンストラクター | × | 〇 |
| 複数継承 | 〇(実装) | × |
なぜ使い分けるのか
同じ機能を持つクラスでも、共通処理を持たせたい場合と、単にルールだけ決めたい場合があります。
- 共通処理も持たせたい → abstract
- ルールだけ決めたい → interface
この考え方で判断すると迷いにくくなります。
IT現場ではどんな場面で使われるのか
interfaceが使われる例
- ログ出力機能
- データベースアクセス
- ファイル保存機能
- 決済サービス
- メール送信機能
例えば、「保存する」という機能だけ決めておけば、CSV保存・Excel保存・データベース保存などを自由に切り替えられます。
abstractが使われる例
- 共通画面クラス
- 社員クラス
- 動物クラス
- 共通帳票クラス
- 基底サービスクラス
共通のプロパティやメソッドをまとめたい場合に利用されます。
初心者が混乱しやすいポイント
どちらもnewできない
interfaceもabstractも直接インスタンス化はできません。
利用するには、それらを実装・継承したクラスを作成します。
abstractでも抽象メソッドを持てる
abstractクラスには、処理を書く通常のメソッドと、子クラスで実装する抽象メソッドの両方を定義できます。
interfaceは親クラスではない
interfaceは「共通の機能を保証する契約」です。
「親クラス」というより、「この機能を必ず持つ」という約束だと考えると理解しやすくなります。
実際のIT現場での利用例
業務システムでは、データベースをSQL ServerからOracleへ変更する場合があります。
データ取得処理をinterfaceで定義しておけば、実装クラスを差し替えるだけで対応できるため、システム全体への影響を最小限に抑えられます。
一方、画面の共通処理やログインチェックなど、多くの画面で共通利用する機能はabstractクラスにまとめるケースがよくあります。
筆者が新人時代に失敗したこと
新人の頃、すべてabstractクラスで設計していました。
しかし、複数の機能を組み合わせたい場面で単一継承の制約に悩み、設計を大きく見直すことになりました。
その経験から、「共通処理が必要ならabstract、ルールだけならinterface」と考えるようになり、設計がシンプルになりました。
業務でよくあるトラブル例
| トラブル | 原因 |
|---|---|
| 継承できない | 既に別の抽象クラスを継承している |
| 実装漏れでコンパイルエラー | interfaceのメソッドを実装していない |
| 設計が複雑になる | abstractを多用している |
| 保守しにくい | 役割を考えず使い分けている |
原因の切り分け
- 共通処理が必要か確認する
- 複数実装が必要か確認する
- 継承関係を確認する
- 実装漏れがないか確認する
- 設計方針を見直す
確認方法
GUIで確認する方法
Visual StudioやIntelliJ IDEA、Eclipseでは、クラス宣言に「interface」または「abstract」が表示されます。
クラス図や継承ツリーを利用すると、継承関係や実装関係を視覚的に確認できます。
CUIで確認する方法
ソースコードを検索し、「interface」「abstract」のキーワードや、implements・extends(Java)、または「:」(C#)の記述を確認します。
確認結果の見方
- 共通処理を持つならabstract
- ルールだけならinterface
- 複数実装が必要ならinterface
初心者がやりがちなミス
- すべてabstractで作る
- interfaceに共通処理を持たせようとする(古いJavaでは不可)
- 継承と実装を混同する
- 役割を考えず選択する
- 設計変更を考慮しない
業務で上司へ報告するポイント
- interfaceとabstractのどちらを採用したか
- 採用理由
- 継承・実装への影響
- 既存システムへの影響範囲
- 動作確認結果
エスカレーションするタイミング
- 基底クラスの変更が必要な場合
- 共通ライブラリに影響する場合
- 設計全体の見直しが必要な場合
- 継承構造を変更する場合
応用知識
Java 8以降では、interfaceにdefaultメソッドやstaticメソッドを定義できるようになりました。
また、C# 8.0以降でもインターフェースに既定実装(Default Interface Methods)を持たせることができます。
ただし、共通処理を多く持たせる用途では、現在でもabstractクラスが選ばれることが一般的です。
関連するIT用語
- クラス(Class)
- 継承(Inheritance)
- 実装(Implement)
- ポリモーフィズム(Polymorphism)
- オーバーライド(Override)
- 抽象メソッド(Abstract Method)
- カプセル化(Encapsulation)
よくある質問(FAQ)
迷ったらどちらを使えばよいですか?
共通の処理や状態を持たせたいならabstract、ルールだけを定義したいならinterfaceを選びましょう。
interfaceとabstractを一緒に使うことはありますか?
あります。実務では、abstractクラスがinterfaceを実装し、子クラスがそれを継承する設計もよく採用されています。
実務ではどちらを使うことが多いですか?
保守性や拡張性を重視する業務システムでは、interfaceを中心に設計し、共通処理が必要な部分だけabstractクラスを利用するケースが多く見られます。
interfaceだけで開発できますか?
可能ですが、共通処理を複数のクラスで重複実装することになりやすいため、共通ロジックがある場合はabstractクラスを組み合わせることが一般的です。
まとめ
interfaceとabstractは似ていますが、役割が異なります。
- interfaceは「できること」を定義するルール
- abstractは共通処理を持つ親クラス
- 複数実装したいならinterface
- 共通の処理や状態を持たせたいならabstract
- 実務では両方を組み合わせて利用することが多い
迷ったときは、「共通の処理を持たせたいのか、それともルールだけを決めたいのか」を考えると、interfaceとabstractを適切に使い分けられるようになります。
