强制特质实现方法

时间:2013-10-22 09:22:15

标签: scala abstract traits concrete

我有一个特性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之间的中间层,提供了一个通用界面。

我在foo中有一个实现的方法I,它调用方法bar(未在I中实现,但在那里定义)。我想要实现的是,所有延伸I 的特征必须实现bar,这样会因为bar未实现而导致编译时错误:

trait Z extends I

这在Scala中是否可行?

P.S。:我知道Force Scala trait to implement a certain method的答案,但我不想要那种明确的耦合。

3 个答案:

答案 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进行所需的早期验证。