## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# Linearization of an Object’s Hierarchy

Because of single inheritance, the inheritance hierarchy would be linear, if we ignored mixed-in traits. When traits are considered, each of which may be derived from other traits and classes, the inheritance hierarchy forms a directed, acyclic graph (see [ScalaSpec2009]). The term linearization refers to the algorithm used to “flatten” this graph for the purposes of resolving method lookup priorities, constructor invocation order, binding of `super`, etc.

Informally, we saw in Stackable Traits that when an instance has more than one trait, they bind right to left, as declared. Consider the following example of linearization:

````// code-examples/ObjectSystem/linearization/linearization1-script.scala`

`class` `C1` {
`def` `m` = `List`(`"C1"`)
}

`trait` `T1` `extends` `C1` {
`override` `def` `m` = { `"T1"` :: `super`.m }
}

`trait` `T2` `extends` `C1` {
`override` `def` `m` = { `"T2"` :: `super`.m }
}

`trait` `T3` `extends` `C1` {
`override` `def` `m` = { `"T3"` :: `super`.m }
}

`class` `C2` `extends` `T1` `with` `T2` `with` `T3` {
`override` `def` `m` = { `"C2"` :: `super`.m }
}

`val` c2 = `new` `C2`
println(c2.m)
```

Running this script yields the following output:

`List(C2, T3, T2, T1, C1)`

This list of strings built up by the `m` methods reflects the linearization of the inheritance hierarchy, with a few missing pieces we’ll discuss shortly. We’ll also see why C1 is at the end of the list. First, let’s see what the invocation sequence of the constructors looks like:

````// code-examples/ObjectSystem/linearization/linearization2-script.scala`

`var` clist = `List ...````

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required