我有一个特性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中是否可行?
P.S。:我知道Force Scala trait to implement a certain method的答案,但我不想要那种明确的耦合。
答案 0 :(得分:1)
我考虑过结构化子类型:
trait I[T<: { def:foo:Unit}]
...
那对你有用吗?
答案 1 :(得分:1)
它似乎是自我类型的用例:
trait Z {
self : I =>
}
编译器将检查包含Z
的层次结构中的任何类是否为I
。
答案 2 :(得分:0)
我不知道在Scala中有什么方法可以强制某个特征为所有方法提供具体的实现。您可以编写一个生成小的测试类的宏,然后编译器将验证该测试类是否具体。编写采用以下代码的宏应该不难:
@VerifyAllMethodsConcrete
trait Z extends I { ... }
并将其转换为以下代码:
trait Z extends I { ... }
class TestClassForVerifyingConcreteMethodsOfZ { }
现在,如果特征Z
没有覆盖bar()
,则会出现一个早期错误,提示TestClassForVerifyingConcreteMethodsOfZ needs to be abstract
。该错误消息尚不十分清楚,但是希望它可以对Z
进行所需的早期验证。