не может переопределить конкретного участника без третьего участника, это переопределяется обоими

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

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

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

У меня есть базовый класс под названием 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 и я получил то сообщение об ошибке.

9
задан Daniel C. Sobral 9 April 2010 в 00:16
поделиться

1 ответ

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

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

11
ответ дан 4 December 2019 в 20:22
поделиться
Другие вопросы по тегам:

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