0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】Kotlin のインターフェースを理解する

Posted at

はじめに

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 (依存性注入) と組み合わせると強力

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?