trait Base
trait Plugin { base: Base =>
def asBase: Base & Plugin = this
}
class Mix extends Base, Plugin
val plug: Plugin = new Mix
val baseA: Base= plug.asBase
val baseB: Base = plug // snorts with "Found: Plugin. Required: Base
为什么呢?
如果我没错的话,里氏替换原则被遵守了,因为所有的Plugin
实例都是一种混合类型,包括Base
的子类型。因此,可以用Plugin
类型的对象代替Base
类型的对象,而不会影响程序的正确性。