【Kotlin/Android】interface(インターフェース)の使い方とメリットとは?

【Kotlin/Android】interface(インターフェース)の使い方とメリットとは?

この記事からわかること

  • Android Studio/Kotlininterfaceとは?
  • メリット使い方
  • メソッドの実装義務にしない方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

interfaceとは?

公式リファレンス:Interfaces

Kotlinのinterfaceとはクラスに実装させたいメソッドやプロパティを定義するための構造です。インターフェース自体は実体(実装)を持たず、クラスが従うべき振る舞いなどの外郭部分(シグネチャ)のみを定義します。

SwiftではprotocolがKotlinのinterfaceと同じ役割を持っています。

interfaceの使い所

abstract(抽象クラス)との違い

同じような役割を持ったabstract(抽象クラス)との違いは以下の通りになります。

特徴 abstract interface
インスタンス化 できない できない
継承の数 1つのみ 複数可能
プロパティ 抽象プロパティ/具象プロパティ 抽象プロパティのみ
メソッド 抽象メソッド/具象メソッド 抽象メソッド/具象メソッド
コンストラクタ 実装可能 実装不可

使い方

interfaceを定義するにはinterfaceを付与して定義します。中には規格として定義しておきたいプロパティやメソッドを定義できます。

interface Human {
    var name: String
    var age: Int
    fun selfIntroduction()
}

定義したinterfaceはクラスに継承させることができ、継承したクラスはinterface定義されているプロパティやメソッドの実装が必須になります。実装するにはoverrideを付与します。

class TargetPerson: Human {
    override var name = "ame"
    override var age = 15
    override fun selfIntroduction() {
        print("Hi! My Name is ame.")
    }
}

未実装の場合は以下のようなコンパイルエラーが発生します。

Class 'TargetPerson' is not abstract and does not implement abstract member public abstract var age: Int defined in com.XXXXX.プロジェクト名.Human

メソッドを実装する

interfaceにはメソッドの中身を実装することができます。

interface Human {
    var name: String
    var age: Int
    fun selfIntroduction() {
        print("-----------")
    }
}

interfaceにメソッドの中身を実装していてinterfaceで実装している処理を動作させたい場合はoverrideしたメソッド内でsuperから対象メソッドを呼び出します。

class TargetPerson: Human {
    override var name = "ame"
    override var age = 0
    override fun selfIntroduction() {
        super.selfIntroduction()
        print("Hi! My Name is ame.")
    }
}

複数のinterfaceを継承させる

クラスには複数のinterfaceを継承させることも可能です。

interface Printer {
    fun selfIntroduction() {
        print("-----------")
    }
}
class TargetPerson: Human, Printer {
    override var name = "ame"
    override var age = 0
    override fun selfIntroduction() {
        super<Human>.selfIntroduction()
        super<Printer>.selfIntroduction()
        print("Hi! My Name is ame.")
    }
}

その際に同名のメソッドなどが定義されていた場合super<インターフェース名>で参照します。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index