gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:06:31 25 4
gpt4 key购买 nike

我有这个具体的类(class):

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: 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")
}

Son 中的姓名和姓氏的类型为 val。

最佳答案

如果我理解正确的话,您希望 Son 中的 namesurname 字段是不可变的,而不是 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 覆盖 vars,我们将从父类中删除被覆盖字段的 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

Person 现在是一个特征 - 它只是提供了一种获取namesurname 的方法。 Son 使用 val 覆盖 Person - 因此您可以保证没有人会再次更改 Son 中的字段。

根据您的示例,我假设您仍然希望拥有一种可以修改的 Person 类型。您可以使用上面的 MutablePerson 类来做到这一点,该类确实允许更改其字段。

希望这有帮助!

关于Scala:使用构造函数参数扩展具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13646993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com