не может переопределить конкретный член без третьего члена, который переопределен обоими - PullRequest
9 голосов
/ 09 апреля 2010

Что означает следующее сообщение об ошибке?

не может переопределить конкретный элемент без третьего члена это отменяется обоими (это правило предназначен для предотвращения `` случайного Переопределение '');

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

У меня есть базовый класс с именем AbstractProcessor, который определяет абстрактный метод вроде этого:

abstract class AbstractProcessor {
  def onPush(i:Info): Unit
}

У меня есть пара существующих черт для реализации различных поведений onPush.

trait Pass1 {
  def onPush(i:Info): Unit = { /* stuff */ }
}

trait Pass2 {
  def onPush(i:Info): Unit = { /* stuff */ }
}

Так что это позволяет мне использовать new AbstractProcessor with Pass1 или new AbstractProcessor with Pass2.

Теперь я хотел бы выполнить некоторую обработку до и после вызова onPush в Pass1 и Pass2, одновременно сводя к минимуму изменения кода для AbstractProcessor и Pass1 и Pass2. Я думал о создании черты, которая делает что-то вроде этого:

trait Custom extends AbstractProcessor {
  abstract override def onPush(i:Info): Unit = {
    // do stuff before
    super.onPush(i)
    // do stuff after
  }
}

И используя его с new AbstractProcessor with Pass1 with Custom, и я получил это сообщение об ошибке.

Ответы [ 2 ]

11 голосов
/ 09 апреля 2010

Проблема в том, что существует неопределенность между AbstractProcessor.onPush и Pass1.onPush. Последний не переопределяет первый, потому что Pass1 не распространяется AbstractProcessor.

Если вы заставите Pass1 и Pass2 продлить AbstractProcessor, то проблема решена.

0 голосов
/ 21 мая 2015

Другое решение состоит в том, чтобы иметь черту, содержащую только:

def onPush(i:Info): Unit

и смешать эту черту с AbstractProcessor, Pass1 и Pass2.Компилятор больше не будет пытаться предотвратить «случайное переопределение».

...