Scala:使用构造函数参数扩展具体类

use*_*663 5 parameters constructor scala extend

我有这个具体的课程:

class Person (var name: String, var surname: String)
Run Code Online (Sandbox Code Playgroud)

我想创建另一个扩展Person的类:

class Son (name: String, surname: String) extends Person(name, surname)
Run Code Online (Sandbox Code Playgroud)

好.但我确实希望Son的构造函数中的字段必须是var而不是val.我该如何解决?字段必须保留构造函数参数.

更新#2

我的问题如下:如果我在Son中定义一个方法,如果我将值更改为Son实例的参数,则不起作用.

class Son (name: String, surname: String) extends Person(name, surname){
  def printSon = {
  if(this.name=="name")println("Error name Person")
  if(this.surname=="surname")println("Error surname Person")
  }
}

object main {
  def main(args: Array[String]): Unit = {}

  val Marco = new Son("Marco","Bianchi")
  Marco.printSon // So far everything is ok
  Marco.name="name"
  Marco.printSon // Here in control is not done, because Marco.name="name" writes in Person
  println("FINE")
}
Run Code Online (Sandbox Code Playgroud)

在儿子名字e姓是val类型.

Mar*_*ila 11

如果我理解正确,你希望namesurname字段Son是不可变的,而不是人物中的那些,即变量.

这根本不可能.唯一的方法是覆盖:

class Person (var name: String, var surname: String)

//this won't compile
class Son(override val name: String, override val surname: String) extends Person(name, surname)
Run Code Online (Sandbox Code Playgroud)

在Scala中,你不能用val覆盖var - 而且很明显为什么 - 子类只能覆盖或添加超类的功能.如果我们允许vals覆盖变量,我们将从父类中删除重写字段的setter.这打破了继承所隐含的"is-a"关系.

你能做的就是这样实现:

trait Person {
    def name: String
    def surname: String
}

//this is fine now
class Son(val name: String, val surname: String) extends Person

//in case you want a type of person which can be changed.
class MutablePerson(var name: String, var surname: String) extends Person
Run Code Online (Sandbox Code Playgroud)

Person现在是一个特质 - 它只是提供了获得name或的方式surname.通过使用vals Son覆盖Person- 因此您可以保证没有人会Son再次更改字段.

从您的示例中我假设您仍然希望有一种Person可以修改的类型.你可以使用MutablePerson上面的类来做到这一点,这允许它的字段被突变.

希望这可以帮助 !


dre*_*xin 6

你必须将params命名为不同,因为否则儿子体内的方法将尝试访问params而不是Person类中的字段.如果你在体内访问它们,Scala会自动为params创建字段.它可以工作,当你做这样的事情(这也是一个常用的模式):

class Son (_name: String, _surname: String) extends Person(_name, _surname){
  def printSon = {
  if(name == "name")println("Error name Person")
  if(surname == "surname")println("Error surname Person")
  }
}
Run Code Online (Sandbox Code Playgroud)