加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:24:50 所属栏目:安全 来源:网络整理
导读:我有这个具体的课程: class Person (var name: String,var surname: String) 我想创建另一个扩展Person的类: class Son (name: String,surname: String) extends Person(name,surname) 好. 但我确实希望Son的构造函数中的字段必须是var而不是val. 我该如何
我有这个具体的课程:

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

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

class Son (name: String,surname: String) extends Person(name,surname)

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

更新#2

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

class Son (name: String,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")
}

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

解决方法

如果我理解正确,你希望Son中的名字和姓氏字段是不可变的,而不是Person中的字符,这些字符是变量.

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

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)

在Scala中,你不能用val覆盖var – 而且很明显为什么 – subclasses can only override or add functionality to a superclass.如果我们允许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

人现在是一个特征 – 它只是提供一种获取姓名的方法.儿子通过使用val来覆盖人 – 因此你可以保证没有人会再次改变Son中的字段.

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

希望这可以帮助 !

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读