【问题标题】:How to override a mutable variable in Trait in scala?如何在 scala 中覆盖 Trait 中的可变变量?
【发布时间】:2013-05-01 02:35:36
【问题描述】:

我想在构造函数中覆盖 Trait 中的一个可变变量。但它会抱怨“在 Int 类型的特征 A 中覆盖变量 a;变量 a 不能覆盖可变变量”。为什么scala不允许我这样做?对此有什么最佳实践吗?谢谢

trait A{
  var a:Int = _
}

class B(override var a:Int) extends A

【问题讨论】:

  • 您是否简化了您的真实案例以提出问题?正如许多答案所指出的那样,用另一个具有相同名称和类型的 var 覆盖是非常没用的。

标签: scala overriding


【解决方案1】:

你不能重写它(因为我现在不知道的原因,除了变量可以被修改,所以为什么要重写它们),但你可以不初始化声明的变量并将后者委托给@987654321 @:

trait A {
  var a: Int
}

class B(var a: Int) extends A

【讨论】:

  • 我认为.. 正在学习自己。这与它如何在编译器中自动生成 setter 和 getter 以及效率有关。但是,是的,我不确定为什么要覆盖它而不是故意复制代码。
【解决方案2】:

覆盖仅适用于方法。覆盖变量没有意义。如果用另一个相同类型的变量覆盖一个变量,会发生什么变化?如果有的话,无论如何都可以随时设置该值,因为它是一个变量:

trait A { 
  var a: Int = _ 
}

class B (a0: Int) extends A {
  a = a0
}

但这可能不是你想要的。您也可以只保留 getter 和 setter 抽象:

trait A {
  def a: Int
  def a_=(value: Int): Unit
}

class B(var a: Int)

这相当于

trait A {
  var a: Int
}

【讨论】:

    【解决方案3】:

    请注意确切地确定您想要通过尝试“覆盖”“var”来实现什么,正如其他人提到的那样,您无论如何都可以更改。

    在许多其他猜测中,一个是您想要类似自我类型成员的东西? self 类型注释允许您访问 mixin 特征或类的成员,而 Scala 编译器确保所有依赖项都正确连接?如果是这样,类似以下的内容将起作用。

    trait B{
    var a:Int = _
    

    }

    trait A{self:B=> var b= a}
    class C extends A with B
    

    【讨论】:

      【解决方案4】:

      尝试使用 val 代替 var 并使用覆盖。 它在 A 是抽象类时起作用,如下所示:

      abstract class A{
        val a:Int = 0
      }
      
      class B extends A{
      override val a:Int=1
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 2018-06-24
        • 2018-05-23
        • 2022-01-23
        • 1970-01-01
        • 2017-05-14
        相关资源
        最近更新 更多