TL;DR
abstract class Foo {
fun func(...) { ... }
}
は
interface Foo
fun Foo.func(...) { ... }
で置き換えられる。
状況想定
Kotlinには、classが継承可能なclassは1つという制約が有ります。
一方、複雑なクラスを実装する際は、複数のclassを継承させたいような場合も有ります。
このようなケースにおいて、対象に抽象プロパティと関数しか持たないようなクラスが含まれるなら、そのクラスをinterface + 拡張関数の形に置き換えることで、継承の制約を回避できます。
手法の意図
interfaceに関数実装を持たせたい場合、デフォルト実装にすることも考えられます。
ただ、デフォルト実装はoverride出来てしまうため、厳密に制約したい場合には不適です。
interface Foo {
// funcはfinalに出来ない
fun func(...) {...}
}
class FooImpl : Foo {
// overrideできてしまう
override fun func(...) { ... }
}
拡張関数であればoverride出来ないため、厳密な制約が実現できます。
関連記事