Scala:使用构造函数参数扩展具体类
我有这个具体的课程:
class Person (var name: String,var surname: String) 我想创建另一个扩展Person的类: class Son (name: String,surname: String) extends Person(name,surname) 好. 更新#2 我的问题如下: 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类来做到这一点,它允许它的字段被改变. 希望这可以帮助 ! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |