如何访问Scala中被重写的数据成员?
如何在Scala中调用重写的数据成员?下面是一个来自工作表的示例--我想做如下操作:如何访问Scala中被重写的数据成员?,scala,inheritance,Scala,Inheritance,如何在Scala中调用重写的数据成员?下面是一个来自工作表的示例--我想做如下操作: trait HasWings { def fly() = println("I'm flying!") val wingType = "Thin" } class Bee extends HasWings { override def fly() = { println("Buzzzz! Also... ") super.fly() // we can do this...
trait HasWings {
def fly() = println("I'm flying!")
val wingType = "Thin"
}
class Bee extends HasWings {
override def fly() = {
println("Buzzzz! Also... ")
super.fly() // we can do this...
}
override val wingType = "Translucent and " + super.wingType // ...but not this!
}
val bumble = new Bee()
bumble.fly()
println(s"${bumble.wingType}")
但是我得到了一个错误,super不能用于value wingType
如何在仍然可以访问数据成员的情况下覆盖它?有一些解决方法,如:
谢谢 不,这根本不可能。正如编译器告诉您的,scala不允许在
val
上使用super
。
如果需要,可以重构代码以使用用于初始化val
的def
。然后,您可以替代设置def
:
trait HasWings {
def wingType0: String = "Thin"
val wingType = wingType0
}
class Bee extends HasWings {
override def wingType0 = "Translucent and " + super.wingType0
}
因此,基本上,答案是使用
def
而不是val
,如果我真的想在超类中使用val
,请使用变通方法。这在我的工作表中起作用。谢谢看看长期以来的but报告。我刚刚点击了这个,我挠头问为什么?我的用例用于确定对象模型缓存多长时间的值。我只是想要一个异常值,不管系统默认值是什么,都是10*。是的,我有一个简单的解决办法,但震惊的是,我根本无法覆盖val modelsCachedFor=10*super.modelsCachedFor。我不想每次缓存一个对象实例时都计算这个值(尽管它很琐碎)——我只想使用(新的)值。