Можно ли создать конструкторы расширений в Kotlin?

в других языках, таких как Swift, существует возможность создания расширения функции, которое добавляет новый конструктор.

что-то вроде этого:

// base class
class Whatever() {
    ...
}

// constructor method extension
fun Whatever.constructor(potato: String) {
    setPotato(potato)
}

fun main(args: Array<String>) {
    println(Whatever("holi"))
}

есть ли какие-либо способы сделать это в Котлине?

3 ответов


Кажется, что нет официального "расширения функции для конструкторов", но вы можете создать метод пакета, который имитирует конструктор

class Foo() {
    ...
}

fun Foo(stuff: Int): Foo = Foo().apply {setStuff(stuff)}

fun main(args: Array<String>){
    println(Foo(123))
}

не как в Swift, потому что:

расширения разрешаются статически. Расширения фактически не изменяют классы, которые они расширяют. Определение расширение, вы не вставляете новые члены в класс, а просто делаете новые функции, вызываемые с помощью точечной нотации по переменным этого тип. (источник)


если определен сопутствующий объект в вашем целевом классе, пойдите с s1m0nw1 по подходи!--6-->. Преимущество в том, что вы можете вызвать функцию расширения без экземпляра (статически) целевого класса.


, если не, используйте классический Заводской шаблон:

class Fruit(var name: String = "") {
}

class FruitFactory {
    companion object {
        fun create(name: String): Fruit {
            return Fruit().apply {
                this.name = "Tasty $name"
            }
         }
    }
}

fun main(args: Array<String>) {
    val orange = Fruit("Orange")
    println(orange.name)

    val apple = FruitFactory.create("Apple")
    println(apple.name)
}

вы можете расширить фабрику по своему усмотрению с помощью дополнительных конструкторов либо вложенных, либо как функции расширения.

выход:

оранжевый
Вкусное Яблоко


вы не можете этого сделать. Что вы можете сделать: продлить