Сеттеры и геттеры в Scala Trait? - PullRequest
4 голосов
/ 12 февраля 2011

В Java я иногда определял бы интерфейс для обеспечения того, чтобы у классов были «сеттеры» и «геттеры».

Например, если у меня есть узел в дереве, я могу определить интерфейс, например:

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 ]

8 голосов
/ 12 февраля 2011

Геттеры и сеттеры не распространены в Scala.Фактически переменная внутренне реализована двумя методами, подобными методам получения / установки.Если вы хотите непостоянное решение (которого обычно избегают в 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), поэтому не беспокойтесь о случаях, когда вам потребуется instanceof в Java.

6 голосов
/ 12 февраля 2011

В Scala геттеры и сеттеры синтаксически идентичны var с. Таким образом, вы можете объявить переменную как var в вашей черте:

trait A {
  var x: Int
}

Тогда вы можете реализовать это как var, или с помощью геттеров и сеттеров, если хотите:

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
}

Наконец, вот как будет выглядеть использование геттеров и сеттеров:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...