2010-11-19 3 views
2

Angenommen, ich möchte die Klasse C erweitern, bekommen SubC.Wie lautet der richtige Aufruf eines Superklassenkonstruktors in Scala?

Jetzt möchte ich auf die Variable c in SubC zugreifen, wie im Beispiel unten in der Methode printC dargestellt.

Die folgende nicht funktioniert, wie printC auf einem SubC Instanz aufrufen druckt SubC 's c und nicht C' s c (Ich glaube, ich bessere Namen ausgewählt haben könnte ...)

class C(protected var c : Int) { 
    def update(n : Int) { 
    c = n 
    } 
} 

class SubC(c: Int) extends C(c) { 
    def printC : Unit = { 
    println(c) 
    } 
} 

object Main { 
    def main(args: Array[String]) { 
    val subC = new SubC(1) 
    subC.update(3) 
    subC.printC // prints 1 
    } 
} 

A möglich (aber nicht wünschenswert) Lösung wäre:

class SubC(cc: Int) extends C(cc) { 
    def printC = { 
    println(c) 
    } 
} 

Dies funktioniert, aber es wird eine neue (und nicht benötigte) -Kennung cc in den Umfang.

Gibt es eine bessere (sauberere) Art, dies zu tun?

PS: Um das obige Beispiel in einen Kontext zu setzen. Was ich eigentlich tun möchte, ist C mit einigen Merkmalen zu erweitern, ohne neue Identifikatoren in den Anwendungsbereich einzuführen.

Antwort

9

Dies ist wahrscheinlich der beste Weg C mit Eigenschaften zu erweitern, ohne die Einführung neue Identifikatoren in -umfang:

class C(protected var c : Int) { 
    def update(n : Int) { 
    c = n 
    } 
} 

trait CanPrintC { 
    self: C => 
    def printC : Unit = { 
     println(c) 
    } 
} 
class SubC(c: Int) extends C(c) with CanPrintC 

object Main { 
    def main(args: Array[String]) { 
    val subC = new SubC(1) 
    subC.update(3) 
    subC.printC // prints 3 
    } 
} 
+0

Nizza denkt ... das Problem mit dieser Lösung ist, dass es eine Abhängigkeit zwischen CanPrintC und C schafft ... Ich könnte mehrere Merkmale von einem anderen Paket haben und das Erstellen eines Wrappers für jeden von ihnen scheint, als würde viel Code dupliziert werden. – dankilman

+0

ok .. sorry .. Gute Lösung. Ich habe es zuerst falsch verstanden. – dankilman

2

Verwenden Selbsttypen:

class SubC(c: Int) extends C(c) { 
    self: C => 
    def printC : Unit = {    
    println(self.c)    
    } 
} 
Verwandte Themen