Можно ли организовать свое собственное расширение в Kotlin? Это можно сделать через Delegate
class MyString {
fun myPrint(text: String) {
println(text)
}
}
Есть класс MyString с методом myPrint(). Допустим нам надо сделать собственное расширение printRealExt() без использование встроенных в Kotlin возможностей
fun MyString.printRealExt(text: String) {
println(text)
}
Реализуем интерфейс и класс с нашим методом "расширения"
interface ExtensionPrint {
fun printExt(text: String)
}
class ExtensionPrintImpl : ExtensionPrint {
override fun printExt(text: String) {
println(text)
}
}
А затем воспользовавшись Delegation делегируем этот метод
class MyString : ExtensionPrint by ExtensionPrintImpl() {
fun myPrint(text: String) {
println(text)
}
}
Синтаксис вызова из расширения и из делегата выглядит одинаково
val myString = MyString()
myString.printRealExt("Real ext")
myString.printExt("Text from ext")
Таким же образом можно организовать множественное наследование в Kotlin
interface OneClassInterface {
fun someOne()
}
class OneClassImpl : OneClassInterface {
override fun someOne() {
println("some One")
}
}
interface TwoClassInterface {
fun someTwo()
}
class TwoClassImpl : TwoClassInterface {
override fun someTwo() {
println("someTwo")
}
}
class DerivedClass : OneClassInterface by OneClassImpl(), TwoClassInterface by TwoClassImpl()
Есть другие способы?