はじめに
Kotlin ではオブジェクト指向を支える重要な仕組みとして インターフェース (Interface) を提供しています。
Java と似ていますが、Kotlin 独自の柔軟さもあります。
1. インターフェースとは?
インターフェースとは、クラスが実装すべき契約 (contract) を定義する仕組みです。
具体的には「何ができるか」を宣言し、その具体的な動作は実装クラスに任せます。
- 複数のインターフェースを実装可能(多重継承ができる)
- 抽象メソッドだけでなく デフォルト実装付きメソッド も書ける
- 状態 (フィールド) を持つことはできないが、プロパティの宣言は可能
2. 基本構文
interface Drawable {
fun draw() // 抽象メソッド
val name: String // 抽象プロパティ
}
class Circle : Drawable {
override val name = "Circle"
override fun draw() {
println("円を描く")
}
}
val c = Circle()
println(c.name) // Circle
c.draw() // 円を描く
インターフェースのメソッドやプロパティは 暗黙的に abstract
になります。
実装クラス側で override
を必ず付けて実装します。
3. デフォルト実装
Kotlin のインターフェースは メソッドのデフォルト実装 を書けるのが特徴です。
interface Logger {
fun log(message: String) {
println("[LOG] $message")
}
}
class ConsoleLogger : Logger
val logger = ConsoleLogger()
logger.log("Hello") // [LOG] Hello
実装クラス側では log
をオーバーライドしなくても使えます。
4. 複数インターフェースの実装
Kotlin では複数のインターフェースを実装できます。
ただし、同じメソッドシグネチャを持つ場合は明示的に解決が必要です。
interface A {
fun show() = println("A")
}
interface B {
fun show() = println("B")
}
class C : A, B {
override fun show() {
super<A>.show() // A の実装を使う
super<B>.show() // B の実装を使う
}
}
val obj = C()
obj.show()
// A
// B
5. インターフェースと抽象クラスの違い
項目 | インターフェース | 抽象クラス |
---|---|---|
多重継承 | 可能 | 不可 |
状態(フィールド) | 持てない | 持てる |
デフォルト実装 | 可能 | 可能 |
主な用途 | 契約(仕様)の定義 | 共通処理+状態の共有 |
「共通の動作だけ共有したい」なら抽象クラス
「仕様だけ定義して自由に実装したい」ならインターフェース
6. 実用例:戦略パターン (Strategy Pattern)
インターフェースはデザインパターンでも多用されます。
例えば「支払い方法」を切り替える処理をインターフェースで表現できます。
interface PaymentStrategy {
fun pay(amount: Int)
}
class CreditCardPayment : PaymentStrategy {
override fun pay(amount: Int) {
println("クレジットカードで $amount 円支払いました")
}
}
class CashPayment : PaymentStrategy {
override fun pay(amount: Int) {
println("現金で $amount 円支払いました")
}
}
fun checkout(amount: Int, strategy: PaymentStrategy) {
strategy.pay(amount)
}
checkout(5000, CreditCardPayment()) // クレジットカードで 5000 円支払いました
checkout(2000, CashPayment()) // 現金で 2000 円支払いました
インターフェースを使うことで 処理の差し替え が容易になります。
まとめ
- インターフェースは「契約 (仕様)」を定義する仕組み
- Kotlin では デフォルト実装も書ける
- 多重実装が可能で柔軟
- 抽象クラスとは用途が異なる(状態を持つかどうかが大きな違い)
- デザインパターンや DI (依存性注入) と組み合わせると強力