※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

10-7. インターフェース (Interface)

2023年10月3日

概要

インターフェースを用いると、クラスに共通するプロパティとメソッドを実装方法を指定することなく、継承先にサポートされるべきものとして定めることができます。

抽象クラスとの違いは以下です。

  • インターフェースはコンストラクタを持つことはできない
  • インターフェースは多重継承できる (複数のインターフェースを親としたサブクラスを作成することができる)
  • インターフェースは、バッキングフィールド (プロパティの値を保持するメモリ領域) を持たない
  • デフォルト実装を持つメソッドを定義することも可能


インターフェースによって、複数のクラスに共通のルールや規則、共通項を持たせることが可能になるといえます。

書式

インターフェースの定義は、キーワード interface に続けてインターフェース名を記載し その後 波かっこ { } でインターフェースの定義部分を囲みます。

interface インターフェース名{
    val プロパティ名 : プロパティの型
    fun メソッド名()

}

インターフェースはコンストラクタは持つことができません。
また、継承後に実装されることを前提としているため、インターフェースのメンバには open や abstract の修飾子が不要となります。

インタフェースのメリット

インターフェースを使用するメリットは、以下の点が挙げられます。

  • 多重継承: Kotlin のクラスは、複数のインターフェースを実装することができます。 これにより、単一継承の制限を超えてクラスに複数の振る舞いを追加することができます。
  • 疎結合: インターフェースは、クラス間の依存関係を弱めることができます。 インターフェースを実装するクラスは、インターフェースで定義された振る舞いを提供する限り、具体的な実装を変更することができます。
  • 柔軟性: インターフェースは、クラスの設計をより柔軟にすることができます。 インターフェースを使用することで、クラスの具体的な実装に依存せずにクラスの振る舞いを定義することができます。

インタフェースとして Person と、thingsTodo を用意しています。
それらを 2つとも多重継承したクラス Employee と Student を作成し、継承したプロパティとメソッドを実装した形です。

interface Person {
    val personName : String
    val personAge : Int
}

interface thingsTodo {
    fun greeting()
    fun commuting() {
        println("家にいます") // デフォルト実装を定義をする
    }
}

class Employee (name: String, age : Int, val empid : Int = 0) : Person, thingsTodo{
    override val personName = name
    override val personAge = age
    override fun greeting() {
        println("私は ${personName} です。年齢は ${personAge} 才です。社員番号は ${empid} です。")
    }
    override fun commuting() {
        println("会社に通います。") 
    }
}

class Student (name: String, age : Int, val studenid : Int = 0) : Person,thingsTodo{
    override val personName = name
    override val personAge = age
    override fun greeting() {
        println("私は ${personName} です。年齢は ${personAge} 才です。学籍番号は ${studenid} です。")
    }
    override fun commuting() {
        println("学校に通います。")
    }
}

fun main(){
    val myEmployeeObj : Employee = Employee("HogeHoge", 24, 20210001)
    val myStudentObj : Student = Student("foobar", 16, studenid = 20221234)

    myEmployeeObj.greeting()
    myEmployeeObj.commuting()

    myStudentObj.greeting()
    myStudentObj.commuting()

}

出力

私は HogeHoge です。年齢は 24 才です。社員番号は 20210001 です。
会社に通います。
私は foobar です。年齢は 16 才です。学籍番号は 20221234 です。
学校に通います。