【问题标题】:Override a trait method for final class in Scala覆盖Scala中最终类的特征方法
【发布时间】:2013-08-06 10:48:42
【问题描述】:

考虑以下几点:

trait TestTrait {
  def doStuff()
}

final class TestClass {
// ...
}

我想实例化一个实现特征中方法的 TestClass 实例。以下不编译:

// Illegal inheritance from final class TestClass
val t = new TestClass with TestTrait {
  def doStuff() {
    println("doing stuff")
  }
}

这是有道理的,因为创建的匿名类将扩展最终类。我真正想要的是一个匿名的特性实现,混入最终类的实例中。

以下工作,但似乎有点迂回。有没有办法在没有声明的 trait 实现的情况下直接执行此操作?

trait TestTraitImpl extends TestTrait {
  def doStuff() {
    println("doing stuff")
  }
}

val t = new TestClass with TestTraitImpl

【问题讨论】:

  • 我很困惑:问题说“以下有效”,但它不起作用(即使 OP 的回答也说它不起作用)。

标签: scala


【解决方案1】:

事实证明,后者也做不到。

final class TestClass

trait TestTrait

val t = new TestClass with TestTrait

显然,任何Foo with Bar 都是创建一个新的匿名类型,因此最终类不能将特征作为混合。这为类 final 增加了很多理论意义,因为它不仅阻止了继承的概念,还阻止了可堆叠的修改。

【讨论】:

    【解决方案2】:

    两种情况下的方法解析规则不同。在第一种情况下,首先通过该类型的方法/属性构造一个匿名类:

    final class TestClass with TestTrait
    

    并且然后您正在尝试覆盖该方法,该方法与TestClass的最终限定符冲突。

    在第二种情况下,您明确指定要覆盖 TestTrait 行为,然后然后将覆盖的行为混合到 TestClass 中。

    我认为使用第二种方法非常好,并且它更清楚地传达了意图是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多