3

我试图找出通过蛋糕模式混合特征和通过老式扩展混合它们之间的区别。这是我的两个例子:

通过扩展

trait X {
  def foo()
}

trait Y extends X {
  def bar()
}

class Z extends Y {
  def foo() = ()
  def bar() = ()
}

通过蛋糕

trait N {
  def foo()
}

trait M {
  this: N =>
  def bar()
}

class U extends M with N {
  def bar() = ()
  def foo() = ()
}

蛋糕方法有什么好处?它们对我来说都是一样的。也许我错了,但我看不出有任何显着差异。

4

1 回答 1

1

如果我想丰富 的功能X,第一种方法:

// I am X
// I give you everything X provides
trait Y extends X {
  def bar()
}

如果我想使用 的功能N,我会使用第二种方法:

// I am an extension of N
// I require you to be N
trait M { this: N =>
  def bar()
}

与“旧时尚”相比,“蛋糕方法”的主要好处是没有预先设置层次结构约束并通过使用“特征线性化”避免(最终)钻石问题。

在您的示例中形成class U实现的特征从右到左解析。拥有健全的方法解析顺序 (MRO) 使我们可以自由地以“可堆叠的方式”混合任何特征。

于 2015-12-13T23:03:48.320 回答