0

私は Scala を勉強していて、ある設計パターンのコードを Java から Scala に翻訳しようとしていますが、細部が失われています。

たとえば、単純なStateを記述したところ、コンパイル時に同じエラーが 3 回発生しました。

これがコードです

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

ドキュメントを読むと、特性の不適切な使用が好きですが、私は特性を使用していません!

StateAとStateBは、抽象クラスであるStatelikeクラスの実装クラスです。それ以上でもそれ以下でもありません。

私のコードエラーはどこですか? 「Java スタイル」の継承が多すぎますか? 何が解決策になりますか?

前もって感謝します

4

1 に答える 1

4

コンパイラは、ここで何をしようとしているのか困惑しています:

myState(new StateA)

うーん...私も困惑しています。myStateパラメータのないメソッドです。

def myState : Statelike = state

したがって、次のようにコードを書き直すことができます。

val ms: Statelike = myState
ms(new StateA)

はメソッドではないためms、最後の行 ( ms(new StateA)) は の短縮バージョンですms.apply(new StateA)applyしかし、クラスにはメソッドがありませんStatelike

myState.writeName(new StateA)の代わりに呼び出したいと思うかもしれませんmyState.(new StateA)が、メソッドのパラメータが不足していますwriteName

セッター

myState_=@AlexIv が述べたように: セッターを呼び出そうとする場合、その名前はではなくであることに注意してくださいmyState

myState_=(new StateA)

シンタックス シュガーを使用:

myState = new StateA
于 2013-08-16T12:27:28.020 に答える