强制性状实施方法
问题描述:
我有一个特点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的答案,但我不想要那种明显的耦合。
答
我想过结构分型:
trait I[T<: { def:foo:Unit}]
....
会为你的工作?
+1
这是你在想什么? 'M级扩展对象以S { DEF巴兹()= FOO() } 性状我[T tobi
+0
是的,我认为那样。 –
答
这似乎是一个用例自我类型:
trait Z {
self : I =>
}
编译器会检查在包括Z
层次结构的任何类或扩展I
。
你不能强迫'特质'来实现类似的东西。 – david
我很好奇,你为什么需要那个?只要您尝试具体实现I(强制您提供def栏),就会收到编译错误。但一个特质是由本质抽象... – Guillaume
我需要它,因为特点和具体的实现住在单独的软件包。这些特质在图书馆里,没有这些特性的具体用法。我可以在我的测试套件中测试这些特征的正确实现。但是,如果错误在编译时已经弹出(例如,在我的IDE中),我希望它更好。 – tobi