Based on a previous question, the following code compiles OK
trait Logger {
def log(msg: String): Unit
}
trait LoggerA extends Logger {
def log(msg: String) = ???
}
trait LoggerB extends Logger {
override def log(msg: String) = ???
}
class Logged1 extends LoggerA
class Logged2 extends LoggerB
class Logged3 extends LoggerA with LoggerB
The override is not required in LoggerA because there is no concrete implementation of log in Logger.
However if I remove the override from LoggerB it no longer compiles:
class Logged3 inherits conflicting members:
def log(msg: String): Nothing (defined in trait LoggerA) and
def log(msg: String): Nothing (defined in trait LoggerB)
(note: this can be resolved by declaring an `override` in class Logged3.)
Why is override required in this specific case? Does specifying override change the method or the class in some way?