Scala 强制执行方法
我有一个traitScala 强制执行方法,scala,abstract,traits,concrete,Scala,Abstract,Traits,Concrete,我有一个traitI(中介),一个classM(混音器)混合了trait和traitS(特定) I充当M和S之间的中间层,提供一个公共接口 我在I中有一个实现的方法foo,它调用一个方法bar(未在I中实现,但在那里定义)。我想要实现的是,所有扩展I的trait都必须实现bar,因此这将引发编译时错误,因为bar未实现: trait Z extends I 这在Scala中可能吗 旁白:我知道的答案,但我不想要那种明确的耦合。我想到了结构子类型: trait I[T<: { def:fo
I
(中介),一个classM
(混音器)混合了trait和traitS
(特定)
I
充当M
和S
之间的中间层,提供一个公共接口
我在I
中有一个实现的方法foo
,它调用一个方法bar
(未在I
中实现,但在那里定义)。我想要实现的是,所有扩展I
的trait都必须实现bar
,因此这将引发编译时错误,因为bar
未实现:
trait Z extends I
这在Scala中可能吗
旁白:我知道的答案,但我不想要那种明确的耦合。我想到了结构子类型:
trait I[T<: { def:foo:Unit}]
trait I[T这似乎是自我类型的一个用例:
trait Z {
self : I =>
}
编译器将检查层次结构(包括Z
中的任何类是否是或扩展I
我不知道在Scala中有任何方法可以强制trait对所有方法都有具体的实现。您可以编写一个宏来生成一个小的测试类,然后编译器将验证测试类是否是具体的。它编写包含以下代码的宏应该不会太难:
@VerifyAllMethodsConcrete
trait Z extends I { ... }
trait Z extends I { ... }
class TestClassForVerifyingConcreteMethodsOfZ { }
并将其转换为以下代码:
@VerifyAllMethodsConcrete
trait Z extends I { ... }
trait Z extends I { ... }
class TestClassForVerifyingConcreteMethodsOfZ { }
现在如果traitZ
没有覆盖bar()
会有一个早期错误,上面写着TestClassForVerifyingConcreteMethodsOfZ需要是抽象的
。这个错误消息并不十分清楚,但希望它能对Z
进行你想要的早期验证。你不能强迫一个特征
实现这样的东西。我很好奇,你为什么需要它t?一旦您尝试具体实现I(强制您提供def bar),就会出现编译错误.但是特征本质上是抽象的…我需要它,因为特征和具体实现存在于不同的软件包中。这些特征在一个库中,没有这些特征的具体用法。我可以在我的测试套件中测试这些特征的正确实现。但是,如果错误已经出现,我会更喜欢它编译时打开(例如,在我的IDE中)。这就是你想要的吗?类M使用S{def baz()=foo()}trait I扩展对象[T是的,我是这样想的。你能添加一个例子吗?如果trait Z
没有定义bar()
。我认为对于self类型,仍然不可能强制trait实现某个方法。如果类使用trait Z
并且Z
没有提供实现,编译器将抛出错误。但是正如我在a中所说的,我希望早点发现错误。