“抽象类不带参数”:为什么?

时间:2013-08-16 12:09:58

标签: scala inheritance methods abstract-class

我正在研究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 的实现类,什么是abstract。 不多也不少。

我的代码错误在哪里?过多的“Java风格”继承? Waht可以解决方案吗?

提前致谢

1 个答案:

答案 0 :(得分: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