我正在研究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可以解决方案吗?
提前致谢
答案 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