斯卡拉特质的塞特犬和吸气剂?

时间:2011-02-12 18:38:21

标签: scala

在Java中,我有时会定义一个接口来确保类具有“setter”和“getter”。

例如,如果我在树中有一个节点,我可能会定义接口,例如:

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
 }

我会在Scala中做同样的事情,还是以不同的方式完成?

2 个答案:

答案 0 :(得分:8)

Getler和setter在Scala中并不常见。实际上,var是通过两个类似getter / setter的方法在内部实现的。如果你想要可变解决方案(如果可能的话,通常在Scala中避免使用),你可以简单地编写

trait Node {
  var left:Node
  var right:Node
  var value:Int
}

class Node2D(var left:Node, var right:Node, var value:Int) extends Node

Node接口在这里提供了很少的附加值,我不喜欢它中的vars的想法,所以我可能完全摆脱接口,或者最终得到一个只读接口和一个可变的类:

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更容易返回更具体的类型(例如Node2D中的Node),所以不要担心需要{{1}的情况在Java中。

答案 1 :(得分:6)

在Scala中,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

值得注意的是,Scala中的首选设计是使用不可变对象并坚持功能编程范例。另请参阅http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-2