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

And*_*yuk 4 scala

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

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

public interface Node { 

    Node getLeft();

    void setLeft(Node node);

    Node getRight();   

    void setRight(Node node);

    int getValue();
}
Run Code Online (Sandbox Code Playgroud)

然后我的节点将实现此接口:

 public Node2D implements Node{
     //implements all of Node's methods along with getters
     // and setters
 }
Run Code Online (Sandbox Code Playgroud)

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

Lan*_*dei 8

Scala中不常见getter和setter.实际上,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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,模式匹配使得Scala更容易返回更具体的类型(例如Node2D来自a Node),所以不要担心instanceofJava中需要的情况.


Ank*_*ave 6

在Scala中,getter和setter在语法上与vars 相同.因此,您可以将变量声明为var特征:

trait A {
  var x: Int
}
Run Code Online (Sandbox Code Playgroud)

那么你可以像a 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
}
Run Code Online (Sandbox Code Playgroud)

最后,这是使用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
Run Code Online (Sandbox Code Playgroud)

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