2010-12-04 4 views
37

Je veux faire ce qui suit, mais la ligne self-type ne compile pas. Est-ce que j'ai une mauvaise syntaxe ou est-ce simplement impossible?Plusieurs self-types sont-ils possibles?

trait A { 
    def aValue = 1 
} 
trait B { 
    def bValue = 1 
} 
trait C { 
    a : A, b : B => 
    def total = a.aValue + b.bValue 
} 

class T extends C with A with B { ... 

Répondre

65

Vous pouvez avoir un seul type qui est un type composé.

Essayez ceci:

trait A { 
    def aValue = 1 
} 
trait B { 
    def bValue = 1 
} 
trait C { 
    self: A with B => 
    def total = aValue + bValue 
} 

class ABC extends A with B with C 
2

Avec un trait vous pouvez le faire avec type structural:

trait C { 
    self: { def aValue: Int 
      def bValue: Int } => 

    def total = aValue + bValue 
} 

class ABC extends C { 
    def aValue = 1 
    def bValue = 1 
} 

Réflexion utilisé.

Mais, premièrement, vous ne devriez pas abuser des auto-types à cause de principle of least power.

Méthodes de question peuvent être ajoutés simplement par l'extension d'autres Tait:

trait C extends A with B{ 
    def total = aValue + bValue 
} 

ou tapez les deux méthodes explicitement:

trait C { 
    def aValue: Int 
    def bValue: Int 

    def total = aValue + bValue 
} 

Où utiliser l'auto-types?

Les autoponts sont généralement utilisés avec les classes. C'est un bon moyen pour que le trait exige d'être une sous-classe d'une classe désirée.

Il y a aussi une bonne utilisation de l'auto-type avec les triats: quand vous voulez manipuler l'ordre de l'initialisation de classe avec l'héritage multiple.

Questions connexes