Pull to refresh

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

Есть другие способы?

Tags:
Total votes 2: ↑2 and ↓0+2
Comments0

Articles