💻 Своё расширение в Kotlin



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




@android_its