2015-05-25 3 views
0

Предположим, у меня есть следующие черты:Переопределить метод реализации с использованием суперкласс/черта

trait A { 
    val a: String = "a" 
} 

trait B { 
    def a: String = "b" 
} 

И я хочу, чтобы смешать обе эти черты в какой-то класс C

class C extends B with A

Компилятор не позволяет мне создать такой класс, потому что я должен переопределить метод a

Я хочу переопределить его usi например, только A. Как я могу это сделать?

EDIT

scala> class C extends B with A { 
    | override val a = super.a 
    | } 
<console>:10: error: super may be not be used on value a 
     override val a = super.a 
          ^

ответ

1

компилятор не может знать, какой из них вы собираетесь использовать, поэтому вы должны указать это нравится:

class C extends B with A { 
    override def a = super[A].a 
} 

Такой подход позволяет выбрать родительский напрямую, независимо от порядка признаков.

Однако, характеристики определяют a по-разному (val и def), поэтому вы должны выбрать только один. Вы должны использовать либо def, либо val по двум признакам (не смешивайте их).

+0

это не будет компилировать – maks

+0

Вы объединили 'def' и' val' в чертах? Какую версию scala вы используете? – petrbel

0

условии, что вы сделать a в def в A черты, вы можете сделать

class C extends B with A { 
    override val a = super.a 
} 

val c = new C 
c.a // "a" 

Это будет работать, потому что A продлевается после B, так super будет его реализация.

+0

это не будет компилировать – maks

+0

почему? Я попробовал, и он действительно компилирует –

+0

. Я отредактировал свой вопрос. Я использую scala 2.10.4 – maks

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