我有一个特征Usertest
,其中我有一个不可变变量name
和一个可变变量age
。在声明我已使用空字符串初始化name
时,我创建了一个类Student
,其中构造函数具有变量name
和Student
类扩展Usertest
。
现在我想在创建Student
的实例时更改name的值,但我不知道该怎么做。
我试过这样的话:
trait Usertest {
val name: String = ""
var age: Int= 12
def setage(setage: Int) = {
age = setage
}
def getAge :Int = age
def getName : String = name
}
class Student(name : String) extends Usertest
object Main extends App {
val st = new Student("ahsen")
var age = st.setage(23)
println("name : " st.name)
println("age : "+ st.getAge)
}
它在控制台上提供此输出:
名称:
年龄:23
答案 0 :(得分:8)
您没有覆盖name
成员,只定义了具有相同名称的类构造函数参数。您应该将val
添加到参数:
class Student(override val name : String)
case class
会默默地为您执行此操作。
注意:您的代码还包括其他在Scala中不惯用的构造,比如定义getter和setter - 统一访问原则会使这种构造变得多余。
答案 1 :(得分:0)
您的代码正常运行,只是setage
不返回任何内容(或者更好,它会返回Unit
,表示为()
)。
你可以用更简单和惯用的方式实现整个事情:
case class Student(name: String, var age: Int = 12)
object main extends App {
val student = Student("ahsen")
student.age = 23
println(s"name: ${student.name}, age: ${student.age}") // "name: ahsen, age: 12"
}
更好的是,您应该完全避免使用可变变量,只需在需要使用copy
构造函数更改对象的属性时创建新实例。像这样
case class Student(name: String, age: Int = 12)
object main extends App {
val student = Student("ahsen")
val newStudent = student.copy(age = 23)
println(s"name: ${student.name}, age: ${student.age}") // "name: ahsen, age: 12"
println(s"name: ${newStudent.name}, age: ${newStudent.age}") // "name: ahsen, age: 23"
}