[英]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
作為M
和S
之間的中間層,提供公共接口。
我有一個實現的方法foo
在I
調用一個方法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.