📜  覆盖 Scala 中的访问器和修改器

📅  最后修改于: 2021-10-20 10:28:47             🧑  作者: Mango

Scala 尚未修复覆盖默认访问器和修改器的标准化方法,但这种编程语言的用户使用一种特定且通用的覆盖方法,下面将详细讨论。

在我们开始之前,什么是访问器和修改器?
Accessors 和 Mutator 可以简单地分别称为 get 和 set 方法。访问器用于通过使用变量或常量来访问数据,帮助用户检索信息,其工作类似于Java和 Mutators 中的“Get”方法,意思是更改,其中变量通过调用函数更改并分配一个新值,它们的工作方式类似于Java的“Set”方法。

考虑以下使用 set 和 get 方法对类 Employee 的Java代码:

public class Employee {
    private String name;
  
    public String getName() {
        return name;
    }
  
    public void setName(String name) {
        this.name = name;
    }
}

如果您尝试使用名为 ‘name’ 的构造函数参数为名为 Employee 的类编写代码并尝试创建 get 和 set 方法,则根据 Scala 约定,您的代码将无法编译。

// error: this won't work
class Employee(private var name: String) {
  def name = name
  def name_=(aName: String) { name = aName }
}

在编译此代码时,会产生以下错误:

Scala 编译器抱怨“name”字段和“name”方法之间的名称冲突。解决此错误的一个简单方法是在字段变量中添加下划线。这解决了歧义。

注意:下划线用于前缀位置而不是后缀位置,以避免错误输入“name_”而不是“name_”的任何危险。由于大量使用 Scala 的类型推断,因此输入错误可能会导致非常混乱的错误。

class Employee(private var _name: String) {
  def name = _name                             // accessor
  def name_=(aName: String) { _name = aName }  // mutator
} 

构造方法的调用方法如下:

val e = new Employee("Adelicia")
e.name = "Alice"    // setter
println(e.name)    // getter

还有其他方法可以命名 getter 和 setter 方法。