0

我正在研究 Scala,我正在尝试将一些设计模式的代码从 Java 转换为 Scala,但我丢失了一些细节。

例如,现在我编写了一个简单的State,但在编译时我收到了三个相同的错误:

这是代码

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

二传手

正如@AlexIv 提到的:如果您尝试调用 setter,则应注意它的名称是myState_=,而不是myState

myState_=(new StateA)

使用语法糖:

myState = new StateA
于 2013-08-16T12:27:28.020 回答