-2

我有一堂课:

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

在这两种情况下,我都有一个错误,所以我什至无法编译它。

我如何使它编译?

4

3 回答 3

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) {
...
}
于 2013-06-04T09:19:22.830 回答
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
于 2013-06-04T09:15:15.940 回答
1

您的代码没有问题。class ChildClass(a: Int) extends BaseClass(a)工作正常。问题在别的地方。

于 2013-06-04T09:24:07.327 回答