簡體   English   中英

強制 trait 實現方法

[英]Force trait to implement method

我有一個特征I (中間體),一個混合了特征的類M (混合器)和一個特征S (特定的)。

class M extends Something with S {
    def baz() = foo()
}

trait I {
    def foo(): { ...; bar(); ... }
    def bar()
}

trait S extends I {
    def bar() = 42
}

I作為MS之間的中間層,提供公共接口。

我有一個實現的方法fooI調用一個方法bar (在沒有實現I ,但其中所述)。 我想要實現的是,所有擴展I特征都必須實現bar ,這樣會引發編譯時錯誤,因為bar未實現:

trait Z extends I

這在 Scala 中可能嗎?

PS:我知道Force Scala trait的答案來實現某種方法,但我不想要那種顯式耦合。

我想到了結構子類型:

trait I[T<: { def:foo:Unit}]

....

那對你有用嗎?

這似乎是 self 類型的用例:

trait Z {
   self : I =>
}

編譯器將檢查層次結構中的任何類,包括Z是或擴展I

我不知道在 Scala 中有什么方法可以強制 trait 對所有方法都有具體的實現。 您可以編寫一個宏來生成一個小的測試類,然后編譯器會驗證該測試類是具體的。 編寫一個包含以下代碼的宏應該不會太難:

@VerifyAllMethodsConcrete
trait Z extends I { ... }

並將其轉換為以下代碼:

trait Z extends I { ... }
class TestClassForVerifyingConcreteMethodsOfZ { }

現在,如果 trait Z沒有覆蓋bar() ,則會出現一個早期錯誤,指出TestClassForVerifyingConcreteMethodsOfZ needs to be abstract 此錯誤消息不是很清楚,但希望這可以對您想要的Z進行早期驗證。

暫無
暫無

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

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