6

我有一个特征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 中可行吗?

PS:我知道Force Scala trait 实现某种方法的答案,但我不想要那种显式耦合。

4

3 回答 3

1

这似乎是自我类型的用例:

trait Z {
   self : I =>
}

编译器将检查层次结构中的任何类,包括Zis 或 extends I

于 2013-10-24T19:59:52.483 回答
1

我想到了结构子类型:

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

……

那对你有用吗?

于 2013-10-22T20:30:37.517 回答
0

我不知道 Scala 中有什么方法可以强制一个特征对所有方法都有具体的实现。您可以编写一个宏来生成一个小型测试类,然后编译器将验证该测试类是具体的。编写一个采用此代码的宏应该不会太难:

@VerifyAllMethodsConcrete
trait Z extends I { ... }

并将其转换为以下代码:

trait Z extends I { ... }
class TestClassForVerifyingConcreteMethodsOfZ { }

现在,如果 traitZ没有覆盖bar(),则会出现一个早期错误,即TestClassForVerifyingConcreteMethodsOfZ needs to be abstract. 此错误消息并不完全清楚,但希望这可以对Z您想要的进行早期验证。

于 2020-11-26T19:28:55.193 回答