Почему класс не может расширить черты с помощью метода той же подписи?

String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
27
задан Xavier Guihot 30 April 2019 в 19:53
поделиться

4 ответа

Это работает для меня в 2.8 и 2.11 и позволит вам не вмешиваться в черты A или B :

trait A { def hi = println("A") }
trait B { def hi = println("B") }

class C extends A with B {
  override def hi = super[B].hi
  def howdy = super[A].hi // if you still want A#hi available
}

object App extends Application {
  (new C).hi // prints "B"
}
52
ответ дан 28 November 2019 в 04:34
поделиться

Вы можете использовать общий базовый признак, скажем Base , следующим образом:

trait Base {def hi: Unit}
trait A extends Base {override def hi = println("A")}
trait B extends Base {override def hi = println("B")}
class C extends A with B

С иерархией типов результат вызова hi выглядит следующим образом (обратите внимание на использование {} для создания экземпляров признаков):

scala> (new A {}).hi
A

scala> (new B {}).hi
B

scala> (new C).hi
B
12
ответ дан 28 November 2019 в 04:34
поделиться

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

Однако, если метод является частным в трейте, это не вызовет проблемы. И если вы хотите, чтобы методы накладывались друг на друга, вы можете определить базовый признак, а затем абстрактное переопределение для наследующих признаков. Однако для определения метода требуется класс. Вот пример этого:

scala> trait Hi { def hi: Unit }
defined trait Hi

scala> trait A extends Hi { abstract override def hi = { println("A"); super.hi } }
defined trait A

scala> trait B extends Hi { abstract override def hi = { println("B"); super.hi } }
defined trait B

scala> class NoHi extends Hi { def hi = () }
defined class NoHi

scala> class C extends NoHi with B with A
defined class C

scala> new C().hi
A
B

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

4
ответ дан 28 November 2019 в 04:34
поделиться

Это проблема ромба . Какой метод hi должен быть унаследован: метод от A или метод от B? Вы можете обойти это, как предложил Дон, используя общую базовую черту.

1
ответ дан 28 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: