是否有可能在Kotlin中创建扩展构造函数?
在Swift等其他语言中,可以创建一个添加新构造函数的函数扩展。
像这样的东西:
// base class class Whatever() { ... } // constructor method extension fun Whatever.constructor(potato: String) { setPotato(potato) } fun main(args: Array<String>) { println(Whatever("holi")) }
在Kotlin有没有办法做到这一点?
不像在Swift中,因为:
扩展名是静态解析的。 扩展实际上并不修改它们扩展的类。 通过定义扩展,不要将新成员插入到类中,而只需使用这种类型的变量的点符号来调用新函数。 ( 来源 )
如果在你的目标类中定义了一个伴随对象 ,那么用s1m0nw1的方法 。 优点是你可以调用扩展函数而不需要目标类的实例(静态的)。
如果没有 ,请使用经典工厂模式:
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) }
您可以使用进一步的构造函数嵌套或作为扩展函数来随意扩展Factory。
输出:
橙子
美味的苹果
似乎没有官方的“构造函数的函数扩展”,但是你可以创建一个模仿构造函数的包装方法
class Foo() { ... } fun Foo(stuff: Int): Foo = Foo().apply {setStuff(stuff)} fun main(args: Array<String>){ println(Foo(123)) }
你不能这样做。 你可以做什么:用工厂方法扩展一个类的companion
对象:
// base class class Whatever() { companion object { } } // factory extension fun Whatever.Companion.withPotato(potato: String) { //setPotato(potato) } fun main(args: Array<String>) { println(Whatever.withPotato("holi")) }
唯一的问题: companion
对象必须存在才能做到这一点。