Solution (source code)

= Solution

\b[<Programming language polymorphism> lets a common interface or operation apply to values of more than one type.] In <subtype polymorphism>, a variable typed by a base class or trait can refer to instances of different implementing classes. A method call is checked through that common interface, then <dynamic dispatch> selects the receiver's overriding implementation. For example, a consumer using `Iterator[Int]` can accept either a filtering <iterator> or a concatenating <iterator> without knowing its concrete class.

Inheritance can establish a subtype relationship, while <method overriding> provides distinct implementations of a shared method signature. The classes must still honour the common behavioural contract; sharing a name alone does not establish substitutability. <Parametric polymorphism> is different: the type parameter in `Iterator[T]` or `FiniteDist[T]` lets a definition work uniformly over element types. <Method overloading> is a further form of <software polymorphism> in which the compiler selects a signature using the static argument types; it should not be confused with runtime receiver dispatch.