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.