所以我有一个特质,我需要在其中有具体的成员变量。不过,这些变量是通过init方法分配的。因此,当我声明它们时,必须将它们分配为null。另一个选择是使用“无”,但随后我必须将它们声明为Option [T],我也不想要。
所以,我的问题是,我可以在Scala中将尚未分配的var声明为null还是None吗?
答案 0 :(得分:3)
我的第一个尝试是使用abstract class
:
abstract class Test(arg1: Int, arg2: String) {
val calculatedInConstructor1 = ??? // use args here
val calculatedInConstructor2 = ??? // use args here
}
new Test(1, "test") {}
如果由于某些原因无法实现,那么仍然可以使用类似的方法实现:
trait Test {
// have to be provided in implementation
protected val arg1: Int
protected val arg2: String
// lazy will defer initialization so you can provide
// arg1 and arg2 in class extending Test
lazy val calculatedOnFirstUse1 = ??? // use args here
lazy val calculatedOnFirstUse2 = ??? // use args here
}
new Test {
val arg1 = 1
val arg2 = "test"
}
没有理由使用var
,null
等。
答案 1 :(得分:0)
您可以将它们定义为方法:
trait Test {
def arg1: Int
def arg2: String
}
val x=new Test {
def arg1=1
def arg2 = "test"
}
您还可以将其覆盖为val
val y=new Test {
val arg1=2
val arg2="test2"
}
val z= new Test{
val arg1=3 // won't compile
}
x.arg1
x.arg2
y.arg1
y.arg2