Можно ли организовать свое собственное расширение в 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()
Есть другие способы?
