强制Scala特性实现某种方法

时间:2013-07-24 22:44:06

标签: scala mixins traits

有没有办法指定特征必须提供方法的具体实现?

给出一些mixin

class A extends B with C {
  foo()
}

如果ABC中的任何一个实现foo(),程序将进行编译。但是,我们如何强迫B包含foo的实施?

1 个答案:

答案 0 :(得分:10)

您可以执行以下操作:

class A extends B with C {
  super[B].foo()
}

只有B 实现 foo时才会编译。但请谨慎使用,因为它(可能)会引入一些不直观的耦合。此外,如果A覆盖foo,则仍会调用B的{​​{1}}。

一个恕我直言有效用例是conflict resolution

foo

如果您想确保trait B { def foo() = println("B") } trait C { def foo() = println("C") } class A extends B with C { override def foo() = super[B].foo() } 声明 B,您可以使用类型归属:

foo

这只会在class A extends B with C { (this:B).foo() } 声明 B时进行编译(但可能会在fooC中实施)。