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

この記事からわかること
- Android Studio/Kotlinのinterfaceとは?
- メリットと使い方
- メソッドの実装を義務にしない方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
interfaceとは?
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<インターフェース名>
で参照します。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。