Можно ли создать конструкторы расширений в 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)
}
вы можете расширить фабрику по своему усмотрению с помощью дополнительных конструкторов либо вложенных, либо как функции расширения.
выход:
оранжевый
Вкусное Яблоко