1
votes

I was trying to convert my understanding about cake patterns in to simple scala code and found out that its not compiling. Could some one please have a look at the below code and tell me whats the problem in the way I understand the patterns? I read this article and was trying out something similar(http://www.cakesolutions.net/teamblogs/2011/12/19/cake-pattern-in-depth)

Here in the code below - println("This is " + userServiceComponent.whatCalc1) //> This is () - I was expecting it to print This is ScifiCalc Calc but its printing This is ()

Code:-

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 ()
}
1
You should use the override keyword all the time. It makes sure when base trait method signature changed, the override sub trait will be forced to change, otherwise compilation errors occuredXiaohe Dong
Yeah got it... thanksAnand

1 Answers

8
votes

Scala is not a dynamic language, it is statically typed. When you made this declaration in trait Calc:

def whatCalc

the absence of a type led Scala to default it's type to Unit. When this method got overridden, the type stayed Unit, so the string values were discarded. Unit has a single instance, which is (), so that's what is being printed.

If you change that line to def whatCalc: String, it should work fine.