Scala 强制执行方法

Scala 强制执行方法,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

我有一个trait
I
(中介),一个class
M
(混音器)混合了trait和trait
S
(特定)

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 { }

现在如果trait
Z
没有覆盖
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中所说的,我希望早点发现错误。