继承和带参数的构造函数

时间:2013-06-04 08:50:59

标签: scala

我有一个班级:

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

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

如何编译?

3 个答案:

答案 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)工作正常。问题出在其他地方。