Con un rasgo puede hacerlo con tipo estructural:
trait C {
self: { def aValue: Int
def bValue: Int } =>
def total = aValue + bValue
}
class ABC extends C {
def aValue = 1
def bValue = 1
}
de reflexión utilizada.
Pero, en primer lugar, no debe abusar de los tipos propios debido a principle of least power.
Métodos de la pregunta se pueden añadir simplemente mediante la extensión de otro tait:
trait C extends A with B{
def total = aValue + bValue
}
o escriba ambos métodos explícitamente:
trait C {
def aValue: Int
def bValue: Int
def total = aValue + bValue
}
Dónde utilizar la auto-tipos?
Los tipos propios se suelen utilizar con las clases. Esta es una buena forma para que el rasgo requiera ser una subclase de una clase deseada.
También hay un buen uso de self-type con triats: cuando se quiere manipular el orden de inicialización de clase con multi-herencia.