如何访问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...

如何在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...
  }

  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。我不想每次缓存一个对象实例时都计算这个值(尽管它很琐碎)——我只想使用(新的)值。