2012-10-24 14 views
7

Her zaman aynı sınıfın türünü döndüren bir yöntem yapmak için bir yöntem var mı?Scala'da bunun türü

Anlatayım:

class Shape { 
    var mName: String = null 
    def named(name: String): Shape = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
    override def named(name: String): Rectangle = { 
    super.named(name) 
    this 
    } 
} 

Bu çalışır, ancak benim alt sınıfların tümünde named fonksiyonunu geçersiz kılmak zorunda kalmadan bunu yapmanın bir yolu var mı? Bunun gibi bir şey arıyorum (bu işe yaramaz):

class Shape { 
    var mName: String = null 
    def named(name: String): classOf[this] = { // Does not work but would be great 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

Herhangi bir fikrin var mı? Yoksa mümkün değil mi?

cevap

18

classOf[this] yerine this.type kullanmanız gerekir. classOf bir elde zamanında çağrılan bir operatör ise Şimdi

class Shape { 
    var mName: String = null 
    def named(name: String): this.type = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

,

scala> new Rectangle().named("foo") 
res0: Rectangle = [email protected] 

scala> res0.mName 
res1: String = foo 

this.type derleme tipi tipi adıdır o (Scala 2.8 inç) çalıştığını göstermek için java.lang.Class nesnesi. Parametrenin bir tür adı olması gerektiğinden, hiç classOf[this] kullanamazsınız. Bir java.lang.Class nesnesini elde etmeye çalışırken iki seçeneğiniz classOf[TypeName] veya this.getClass()'u aramaktır.

+0

Tekton türünün, bu “olmayanlar” için kullanılamayacağını belirtmek gerekir. – pedrofurla

+0

@pderofurla: Yol bağımlı türlerle mümkün olabileceği görülüyor, ancak Scala'daki yola bağımlı türler hakkında çok az şey biliyorum ve hala deneysel olup olmadığından emin değilim. –

+0

Bunun yollara bağlı türlerle ilgili olduğunu sanmıyorum. Ve hayır, yola bağımlı türler deneysel değildir. – pedrofurla