斯卡拉特质中的Setter和Getters?
问题描述:
在Java中,我有时会定义一个接口来确保类有“setters”和“getters”。斯卡拉特质中的Setter和Getters?
举例来说,如果我有一个树中的节点我可能定义的接口,如:
public interface Node {
Node getLeft();
void setLeft(Node node);
Node getRight();
void setRight(Node node);
int getValue();
}
,然后我的节点将实现这个接口:
public Node2D implements Node{
//implements all of Node's methods along with getters
// and setters
}
我会做同样的在斯卡拉,还是以不同的方式完成?
答
吸气剂和吸附剂在斯卡拉并不常见。实际上,一个var是通过两个类似getter/setter的方法在内部实现的。如果你想在可变的解决方案(这通常是在斯卡拉如果可能避免的),你可以简单地写
trait Node {
var left:Node
var right:Node
var value:Int
}
class Node2D(var left:Node, var right:Node, var value:Int) extends Node
节点接口这里提供了一些额外的价值,我不喜欢它瓦尔的想法,所以我可能会摆脱接口的产品总数,或将结束与一个只读接口和一个可变类:
trait Node {
def left:Node
def right:Node
def value:Int
}
class Node2D(var left:Node, var right:Node, var value:Int) extends Node
注意,模式匹配使得它在Scala中更容易得到一个更具体类型(如从Node
起的Node2D
),所以不要担心在Java中需要instanceof
的情况。
答
在斯卡拉,getter和setter在语法上与var
相同。所以,你可以声明变量为var
在您的特质:
trait A {
var x: Int
}
然后,你可以实现它只是作为一个var
,或用getter和setter方法,如果你想:
class B extends A {
var _x: Int = 0
def x: Int = _x
def x_=(value: Int) {
println("Setting x to "+value)
_x = value
}
}
class C extends A {
var x = 1
}
最后,这里是如何它看起来像使用getter和setter方法:
val b = new B
b.x // is 0
b.x = 10
b.x // is 10
val c = new C
c.x // is 1
c.x = 20
c.x // is 20
值得一提的是,在斯卡拉的首选设计是使用一成不变的对象坚持功能性编程范例。另见http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-2。
谢谢,我用过你的第二个例子,迄今为止工作! – drozzy 2011-02-13 00:51:07