强制性状实施方法

问题描述:

我有一个特点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呢?

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

+0

你不能强迫'特质'来实现类似的东西。 – david

+1

我很好奇,你为什么需要那个?只要您尝试具体实现I(强制您提供def栏),就会收到编译错误。但一个特质是由本质抽象... – Guillaume

+0

我需要它,因为特点和具体的实现住在单独的软件包。这些特质在图书馆里,没有这些特性的具体用法。我可以在我的测试套件中测试这些特征的正确实现。但是,如果错误在编译时已经弹出(例如,在我的IDE中),我希望它更好。 – tobi

我想过结构分型:

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

....

会为你的工作?

+1

这是你在想什么? 'M级扩展对象以S { DEF巴兹()= FOO() } 性状我[T tobi

+0

是的,我认为那样。 –

这似乎是一个用例自我类型:

trait Z { 
    self : I => 
} 

编译器会检查在包括Z层次结构的任何类或扩展I

+0

请问您可以添加一个例子吗?如果'trait Z'没有定义'bar()',我看不到编译时错误。 – tobi

+0

我认为自我类型仍然不可能强制**特质**实施某种方法。如果** class **使用'trait Z'并且'Z'没有提供实现,则编译器会引发错误。但正如我在[先前的评论](http://*.com/questions/19513843/force-trait-to-implement-method#comment28960874_19513843)中所说,我想早点发现错误。 – tobi