我有一个班级:
class BaseClass(val a: Int) {
//....
}
一个可以用两种方式表示的子类:
class ChildClass extends BaseClass {
//...
}
或
class ChildClass(a: Int) extends BaseClass(a) {
// if I use val keyword, it doesn't change anything -- the error remains
//...
}
// the error:
//overriding value a in class BaseClass of type Int;
//[error] value a needs `override' modifier
在这两种情况下我都有错误,所以我甚至无法编译它。
如何编译?
答案 0 :(得分:2)
首先,在您的情况下,您无法使用构造
扩展BaseClass
class ChildClass extends BaseClass {
...
}
因为你没有为BaseClass的构造函数提供参数。
您应该执行以下操作:
val myVal: Int = 5;
class ChildClass extends BaseClass(myVal) {
...
}
(顺便说一句,你的后一种扩展形式是正确的。)
第二个(以及问题的性质),您无法在不添加ChildClass
修饰符的情况下为override
'构造函数指定相同的参数列表签名,这样:
class ChildClass(override val a: Int) extends BaseClass(a) {
...
}
答案 1 :(得分:1)
将ChildClass
声明为
class ChildClass(val a: Int) extends BaseClass(a)
表示您(尝试)引入私有字段ChildClass.a
。由于BaseClass.a
已经声明,因此错误告诉您需要明确声明要覆盖BaseClass.a
,即
class ChildClass(override val a: Int) extends BaseClass(a)
你可以通过
来避免这种情况a)重新命名新引入的变量,例如,
class ChildClass(val _a: Int) extends BaseClass(_a)
b)或在BaseClass
中声明但未定义它。但是,只有当BaseClass
可以是抽象的时,这才有效:
abstract class BaseClass {
def a: Int
}
class ChildClass(val a: Int) extends BaseClass
答案 2 :(得分:1)
您的代码没有问题。 class ChildClass(a: Int) extends BaseClass(a)
工作正常。问题出在其他地方。