インターフェース

Kotlinにおけるインターフェース(interface)は、クラスに特定の機能を提供するための型定義の一種であり、**複数のクラスで共有される機能の契約(仕様)を定義する手段です。Javaと同様に、Kotlinのインターフェースはメソッドのシグネチャ(名前と引数)**を定義し、実装は含めても含めなくてもよいという特徴があります。


1. インターフェースの基本構文

kotlin
interface Drivable { fun drive() fun stop() { println("Stopping the vehicle") } }

この例では、Drivable インターフェースは2つの関数を持っています。

  • drive()抽象メソッド(本体がなく、実装を要求)

  • stop()デフォルト実装付きメソッド(本体があり、実装を省略可能)


2. インターフェースの実装

kotlin
class Car : Drivable { override fun drive() { println("Driving the car") } }
  • Car クラスは Drivable インターフェースを実装し、drive() メソッドのオーバーライドが必須です。

  • stop() メソッドは Drivable に実装されているため、Car クラスで省略可能です。


3. インターフェースの特徴

  • プロパティの定義も可能(getterやsetterを含められる):

    kotlin
    interface Identifiable { val id: String }
  • 多重実装が可能(Kotlinではクラスの多重継承はできないが、インターフェースは複数実装できる):

    kotlin
    interface Flyable { fun fly() } class Drone : Drivable, Flyable { override fun drive() { println("Rolling on wheels") } override fun fly() { println("Flying in the air") } }
  • デフォルト実装の競合がある場合、明示的な指定が必要:

    kotlin
    interface A { fun greet() = println("Hello from A") } interface B { fun greet() = println("Hello from B") } class C : A, B { override fun greet() { super<A>.greet() // どちらを呼ぶか明示 } }

4. 抽象クラスとの違い

特徴 インターフェース 抽象クラス
継承の可否 複数インターフェースを実装可能 単一継承のみ
コンストラクタ 定義できない 定義可能
プロパティ 抽象またはgetterだけ持てる フィールド、初期化も可能
デフォルト実装 関数に対して可能 関数・フィールドどちらも可能

まとめ

Kotlinのインターフェースは、抽象的な契約(API)を定義しつつ、共通ロジックの実装も一部可能にする柔軟な機能です。クラスが共通の振る舞いを持ちつつも、独立して異なる実装をしたいときに有効です。特にKotlinでは、Javaよりもインターフェースに柔軟な実装が許されているため、継承よりもインターフェースによる設計が推奨されるケースが多いです。

生成日:2025/05/04