2017-10-05 27 views
5

Swift gibi diğer dillerde, yeni bir kurucu ekleyen bir işlev uzantısı oluşturma olasılığı vardır. BöyleKotlin'de uzatma yapıcılar oluşturmak mümkün mü?

şey:

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

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

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

KOTLIN bunu yapmanın herhangi bir araç var mı? ,

cevap

9

resmi "yapıcıları için işlev uzantısı" olmadığı şeklinde görünüyor ama

class Foo() { 
    ... 
} 

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

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

Bu kurguyu taklit etmiyor, fabrika kalıbı :) –

+3

Haklısın ama bu bir fark var, Factory.foo (123) 'i aramana gerek yok. Şeker kodu yine de – Aracem

+2

@WilliMentzel Müşteriler için bir kurucu taklit eder: onlar bir kurucu olarak aynı şekilde adlandırırlar ve bunun ne olduğunu bilmelerine gerek yoktur. –

6

Swift gibi değil bir kurucu taklit bir paket yöntemi oluşturabilir çünkü:

Extensions statik olarak çözülür. Uzantılar aslında genişletecek sınıfları değiştirmez. Bir uzantısını tanımlayarak, bir sınıfa yeni üyeler eklemezsiniz, ancak bu türündeki değişkenlerde nokta notasyonu ile yeni işlevlerini callable yapabilirsiniz. Bir arkadaşı nesne s1m0nw1's approach ile gitmek, hedef sınıfında tanımlanırsa


(Source)

. Avantajı, hedef sınıfın bir örneğini (statik olarak) genişletme işlevini çağırabilmenizdir. Eğer daha fazla kurucular ya iç içe ya da uzatma fonksiyonları ile istedikleri gibi

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) 
} 

Sen Fabrikası uzatabilirsiniz:


değil ise klasik Fabrikası Desen kullanın.

Çıktı:

Turuncu
Lezzetli elma

4

Sen bunu yapamaz. Gerçi yapabilecekleriniz: Bir fabrika yöntemi ile bir sınıfın companion nesneyi uzatın:

// 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")) 
} 

tek sorunu: Bir companion nesne bunun için var olduğu için vardır.

+0

, bu gitmek için yol! +1 –

İlgili konular