Linearization
The reason why multiple inheritances become a burden when we try to implement them is due to the diamond problem. Take a look at the following image:
Diamond problem
Here, suppose we have an abstract class named Language
, that has a method named sayHello
. Two traits, named British
and Spanish
, extend the abstract Language
class and define their own implementation of the sayHello
method. Then we create a trait, named Socializer
, that mixes in the other two traits with a super
call to the sayHello
method implementation. Now, confusion occurs as to which implementation of sayHello
is getting called when we invoke this method. The primary reason for this problem is there's no multiple inheritance in Java, but Scala supports a form of multiple inheritance through trait mix-in. The concept Scala uses to resolve the problem of super calls is linearization. Let's first code for the problem and see it's behavior, then we'll understand linearization and the rules that justify the behavior...