2013-08-16 170 views
0

我正在學習Scala,我正在嘗試將一些設計模式的代碼從Java轉換爲Scala,但我失去了一些細節。「抽象類沒有參數」:爲什麼?

例如,現在我寫一個簡單的國家但我收到三宗在編譯時相同的錯誤:

這是代碼

abstract class Statelike { 
    def writeName(STATE_CONTEXT : StateContext , NAME : String): Unit 
} 

class StateA extends Statelike { 
    override def writeName(STATE_CONTEXT : StateContext , NAME : String) : Unit = { 
     println(NAME.toLowerCase()); 
     STATE_CONTEXT.myState(new StateB) **//same error** 
    } 
}//end StateA 


class StateB extends Statelike { 
    var count = 0; 
    override def writeName(state_contest: StateContext , name: String) : Unit = { 
    println(name.toUpperCase()); 
    count+1; 
    var conto2 = count; 
    if (conto2 > 1) { 
     state_contest.myState(new StateA)  **//same error** 
    } 
    } 
}//StateB 

class StateContext { 

    var state : Statelike = null 

    def StateContext() { 
     myState(new StateA) **//same error** 
    } 

    def myState_=(s1 : Statelike) = {state = s1} 

    def myState : Statelike = state 

    def writeName (NAME : String): Unit = { 
     myState.writeName(this, NAME); 
    } 
}//end StateContext 

object TestClientState { 
    def main(args : Array[String]) { 
     var SC = new StateContext(); 

     SC.writeName("Monday"); 
     SC.writeName("Tuesday"); 
     SC.writeName("Wednesday"); 
     SC.writeName("Thursday"); 
     SC.writeName("Friday"); 
     SC.writeName("Saturday"); 
     SC.writeName("Sunday"); 
    } 
} 

錯誤出現次數是:

State.scala:12: error: Statelike does not take parameters 
     STATE_CONTEXT.myState(new StateB) 
          ^
State.scala:26: error: Statelike does not take parameters 
      state_contest.myState(new StateA) 
           ^
State.scala:37: error: Statelike does not take parameters 
     myState(new StateA) 
      ^
three errors found 

閱讀文檔,它喜歡不正確地使用特徵,但我沒有使用特徵!

狀態σStateB是實現類類Statelike的,什麼是抽象的。 不多不少。

我的代碼錯在哪裏?過多的「Java風格」繼承? Waht可以成爲解決方案嗎?

在此先感謝

+0

我猜你[R試圖FDO是讓getter和setter方法明確,嘗試,而不是'state_contest.myState(新狀態σ)''state_contest.myState =新StateA' – 4lex1v

回答

4

編譯器迷惑不解你正在嘗試做的:

myState(new StateA) 

嗯......我疑惑了。 myState是一個沒有參數的方法。

def myState : Statelike = state 

所以,你可以重寫你的代碼是這樣的:

val ms: Statelike = myState 
ms(new StateA) 

由於ms不是方法的最後一行(ms(new StateA))是ms.apply(new StateA)的縮短版。但Statelike中沒有方法apply

也許你想調用myState.writeName(new StateA)而不是myState.(new StateA),但方法writeName沒有足夠的參數。

二傳手

由於@AlexIv提到:如果你想打電話給二傳手,你要注意,它的名字是myState_=,不myState

myState_=(new StateA) 

有了語法糖:

myState = new StateA 
+0

他正試圖讓getter和setter顯式化,就像scalac desugars vals一樣。他應該寫'myState = new StateA',而不是'myState(new StateA)',因此可以使用'def myState _ =(s1:Statelike)= {state = s1}',並且在這種情況下使'var state'專用 – 4lex1v

+0

2我的錯誤:1)_def StateContext()_:類的簽名是構造函數,與Java不同,我不必聲明顯式構造函數。 2)myState_調用錯誤,正確的代碼是class.myState _ =(/ * new value * /)。 Ihneritance不是問題 – alepuzio

+0

@alepuzio:1)是的,'def StateContext()'是一種常用方法,而不是構造函數。你可以設置'state':'var state:Statelike = new StateA'。即使你不想設置'state',你可以使用'_'而不是'null':'var state:Statelike = _'。 '_'適用於所有類型,不僅是'AnyRef'。 – senia

相關問題