2010-12-04 6 views
37

Я хочу сделать следующее, но строка самонастройки просто не компилируется. У меня этот синтаксис неправильный или это просто невозможно?Возможны ли множественные самонастройки?

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 { ... 

ответ

65

У вас может быть отдельный тип типа, который является составным.

Попробуйте это:

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

С одна черта вы можете сделать это с структурного типа:

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

    def total = aValue + bValue 
} 

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

Отражение используется.

Но, во-первых, вы не должны злоупотреблять самонаборами из-за principle of least power.

Метода от вопроса может быть добавлена ​​просто простирающимся другим Тайтом:

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

или введите оба метода в явном виде:

trait C { 
    def aValue: Int 
    def bValue: Int 

    def total = aValue + bValue 
} 

Где использовать автономный типы?

Самостоятельные типы обычно используются с классами. Это хороший способ для характеристики, чтобы требовать быть подклассом желаемого класса.

Существует также одно хорошее использование самонастройки с триатами: когда вы хотите манипулировать порядком инициализации класса с многоуровневым.

Смежные вопросы