1

我试图将我对蛋糕模式的理解转换为简单的 scala 代码,发现它没有编译。有人可以看看下面的代码并告诉我我理解模式的方式有什么问题吗?我读了这篇文章并尝试了类似的东西(http://www.cakesolutions.net/teamblogs/2011/12/19/cake-pattern-in-depth

在下面的代码中println("This is " + userServiceComponent.whatCalc1) //> This is ()- 我期待它打印This is ScifiCalc Calc但它的打印This is ()

代码:-

trait Calc {
  def whatCalc
}

trait NormalCalc extends Calc {
  def whatCalc = new String("Normal Calc")
}

trait ScifiCalc extends Calc {
  def whatCalc = new String("ScifiCalc Calc")
}

trait TestTrait{
  def whatCalc1
}

trait TestCalc extends TestTrait {  
  this: Calc =>;

  def whatCalc1 = {
    whatCalc
  }
}

object SelfReferenceExample {
  println("Welcome to the Scala worksheet") 
  val userServiceComponent = new TestCalc with ScifiCalc {}
  println("This is " + userServiceComponent.whatCalc1) //> This is ()
}
4

1 回答 1

8

Scala 不是动态语言,它是静态类型的。当您在 trait 中做出此声明时Calc

def whatCalc

缺少类型导致 Scala 将其类型默认为Unit. 当此方法被覆盖时,类型保持不变Unit,因此字符串值被丢弃。Unit有一个实例,即(),所以这就是正在打印的内容。

如果您将该行更改为def whatCalc: String,它应该可以正常工作。

于 2014-08-03T01:55:30.407 回答