2010-11-19 16 views
2

Supposons que je souhaite étendre la classe C, en obtenant SubC.Quelle est la bonne façon d'appeler un constructeur de superclasse dans Scala?

Maintenant, je voudrais accéder à la variable c en SubC comme présenté dans l'exemple ci-dessous dans la méthode printC.

Ce qui suit ne fonctionne pas, comme appeler printC sur un SubC exemple imprimera SubC 's c et non C est c (je suppose que je aurais pu choisir de meilleurs noms ...)

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 possible (mais indésirable) solution serait:

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

Cela fonctionne, mais il introduit un nouvel identificateur (et non nécessaire) cc dans le champ d'application.

Existe-t-il une meilleure façon (plus propre) de faire cela? PS: Pour mettre l'exemple ci-dessus dans un certain contexte.

Ce que je veux réellement faire est d'augmenter C avec quelques traits sans introduire de nouveaux identifiants dans la portée.

Répondre

9

Ceci est probablement la meilleure façon d'augmenter C avec des traits sans introduire de nouveaux identifiants de portée:

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

pensée de Nice ... Le problème avec cette solution est cela crée une dépendance entre CanPrintC et C ... Je pourrais avoir plusieurs traits d'un paquet différent et créer un wrapper pour chacun d'entre eux semble être beaucoup de code dupliqué. – dankilman

+0

ok .. désolé .. Bonne solution. Je l'ai mal compris au début. – dankilman

2

Utilisez les types d'auto:

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