Что означает следующее сообщение об ошибке?
не может переопределить конкретного участника без третьего участника, это переопределяется обоими (это правило разработано для предотвращения ''случайных переопределений'');
Я пытался сделать наращиваемые модификации черты. Это немного после факта, так как я уже имею в распоряжении иерархию и я пытаюсь изменить поведение, не имея необходимость переписывать много кода.
У меня есть базовый класс под названием 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
и я получил то сообщение об ошибке.
Проблема в том, что существует неоднозначность между AbstractProcessor.onPush
и Pass1.onPush
. Последний не переозирает первый, потому что Pass1
не расширяет AbstractProcessor
.
Если сделать Pass1
и Pass2
расширить AbstractProcessor
, то проблема решена.