I'm wanting to do something like this:
class A (var updateCount: Int) {
}
class B (val name: String, var updateCount: Int) extends A(updateCount) {
def inc(): Unit = {
updateCount = updateCount + 1
}
}
var b = new B("a", 10)
println(b.name)
println(b.updateCount)
b.updateCount = 9999
b.inc
println(b.updateCount)
but the compiler doesn't like it.
(fragment of extend.scala):5: error: error overriding variable updateCount in class A of type Int;
variable updateCount needs `override' modifier
class B (val name: String, var updateCount: Int) extends A(updateCount) {
Adding override on updateCount doesn't work either. What's the clean way to do this?
You don't need to declare the var
in the subclass constructor signature:
class B (val name: String, /* note no var */ updateCount: Int) extends A(updateCount) {
//...
}
This also extends to classes with val
s in their constructors also:
scala> class C(val i: Int)
defined class C
scala> class D(j: Int) extends C(j)
defined class D
You need to avoid having the identifier declared for B
shadowing the identifier declared for A
. The easiest way to do that is to chose a different name. If, however, you really, really don't want to do that, here is an alternative:
class B (val name: String, updateCount: Int) extends A(updateCount) {
self: A =>
def inc(): Unit = {
self.updateCount = self.updateCount + 1
}
}
And, by the way, drop the var
from B declaration.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With