В соответствии с этим Erik Osheim slide, он говорит, что наследование может решить ту же проблему, что и typeclass, но упоминает, что наследование имеет проблему:
хрупкий кошмар наследования
и говорит, что наследование
плотное связывание полиморфизма с типами членов
Что он имеет в виду?
На мой взгляд, Inheritance хорош для расширения, либо для изменения реализации существующего типа, либо для добавления нового типа элемента (подтипа) в интерфейс.
trait Foo { def foo }
class A1 extends Foo{
override def foo: Unit = ???
}
//change the foo implementation of the existing A1
class A2 extends A1 with Foo{
override def foo = ???
}
// add new type B1 to Fooable family
class Bb extends Foo{
override def foo = ???
}
Теперь в терминах typeclass:
trait Fooable[T] { … }
def foo[T:Fooable](t:T) = …
class Aa {…}
class Bb {…}
object MyFooable {
implicit object AaIsFooable extends Fooable[Aa]
implicit object B1IsFooable extends Fooable[Bb]
…
}
Я не вижу причин предпочитать Typeclass, я что-то упустил?