Kotlin ではインターフェースに抽象的なプロパティをを宣言する事が可能です。
例えば以下のようなものです。
interface Cat { val kind: String }
Cat インターフェースを実装するクラスにおいて、kind の値を取得する手段を提供しなければならないという意味になります。
インターフェースは、その値がバッキングフィールドに格納されるか、getterを使って取得されるかの指定などはしていません。
インターフェースそのもは状態を持ちません。
インターフェースを実装するクラスのみが必要に応じて値を保持可能です。
先ほどのインターフェースに対する実装クラスは以下のようにいくつも可能性があります
// 猫種不明 class UnknownCat(override val kind: String) : Cat
// 雑種 class HybridCat : Cat { override val kind = "Hybrid" }
// アメリカンショートヘア class AmericanShortHair : Cat { override val kind: String get() = this::class.java.simpleName }
UnknownCat の場合は、プライマリコンストラクタないでプロパティを直接宣言する構文を使っています。
このプロパティは、Catの抽象プロパティを実装しているため override と指定する必要があります。
HybridCat は初期化時に kind プロパティに値を代入しています。
AmericanShortHair はカスタムプロパティで、自身のクラス名を kindプロパティの値として返すようにしています。
interface Cat { val kind: String // 猫種 val name: String // 名前 get() = "${kind.toLowerCase()}-Miko" }
このインターフェースの場合、抽象プロパティ kind とカスタムgetter を持った name プロパティを宣言しています。
kind プロパティは実装クラスによってオーバーライドされる必要がありますが、 name プロパティをそのまま使用できます。
まとめ
本エントリで対象とした記述範囲の区切りが変な感じもするのでまとめを書きにくいですが、
Kotolin でインターフェース内で宣言されたプロパティを実装する方法がわかりました。