簡體   English   中英

在Scala中為最終課程覆蓋特征方法

[英]Override a trait method for final class in Scala

考慮以下:

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

事實證明,后者也不能。

final class TestClass

trait TestTrait

val t = new TestClass with TestTrait

顯然,任何Foo with Bar都是創建一個新的匿名類型,因此最終類不能具有mixin的特征。 這為最終的類添加了很大的理論意義,因為它不僅阻止了繼承的概念,而且還阻止了可堆疊的修改。

在兩種情況下,方法解析規則不同。 在第一種情況下,首先根據類型的方法/屬性構造一個匿名類:

final class TestClass with TestTrait

然后您嘗試覆蓋該方法,該方法與TestClass的最終限定符沖突。

在第二種情況下,您明確指定要覆蓋TestTrait行為, 然后將覆蓋的行為混合到TestClass中。

我認為使用第二種方法非常好,並且可以更清楚地傳達其意圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM