我试图将对象的状态传递给“外部”,因此稍后可以通过将其传回来恢复,但不会将私有状态透露给外部世界。在Java中,我可以使用内部类来执行此操作:
class Walker {
class State {
private int pos;
private State (int p) {
pos = p;
}
}
private int pos = 0;
State setState () {
return new State(pos);
}
void setState (State s) {
pos = s.pos;
}
}
但是,如果我在Scala中尝试相同,则表示Walker#setState可能无法访问State#pos。
class Walker {
private var pos = 0
def state = new Walker.State(pos)
def state_= (s: Walker.State) {
pos = s.pos
}
}
object Walker {
class State (private val pos: Int)
}
如何归档与Java相同的内容? (克隆对象的其他人)
答案 0 :(得分:2)
在类Sate
内轻松声明课程Walker
:
class Walker {
class State(pos: Int) {
// other functionnalities
}
// use State
}
答案 1 :(得分:2)
在Scala中,每个外部类都有它自己的内部类类型,这意味着outer1.inner.getClass!= outer2.inner.getClass。
如果您需要为所有Walkers提供相同的State类(例如,将Walker1状态指定为walker2),那么您的问题是否需要清楚。
我假设你确实希望它具有相同的类类型。所有你需要的是将Walker伴侣对象中的State定义为private [Walker]:
class Walker {
private var pos = 0
def state = new Walker.State(pos)
def state_= (s: Walker.State) {
pos = s.pos
}
}
object Walker {
class State (private[Walker] val pos: Int)
}
val w1 = new Walker //> w1 : demos.Walker = demos$Walker@4fccd51b
val w2 = new Walker //> w2 : demos.Walker = demos$Walker@475530b9
w1.state = w2.state
它的作用是将State的pos定义为除Walker之外的所有人。详细了解here。
如果你不需要状态在Walker实例之间相同,那么你可以将State定义移动到类本身,并将其限定为外部类:private[Walker] class State (private[Walker] val pos: Int)