【发布时间】:2013-07-24 22:44:06
【问题描述】:
有没有办法指定特征必须提供方法的具体实现?
给定一些混入
class A extends B with C {
foo()
}
如果A、B 或C 中的任何一个实现foo(),程序将编译。但是我们如何强制,例如,B 包含foo 的实现?
【问题讨论】:
有没有办法指定特征必须提供方法的具体实现?
给定一些混入
class A extends B with C {
foo()
}
如果A、B 或C 中的任何一个实现foo(),程序将编译。但是我们如何强制,例如,B 包含foo 的实现?
【问题讨论】:
您可以执行以下操作:
class A extends B with C {
super[B].foo()
}
只有在B 实现 foo 时才会编译。但请谨慎使用,因为它(可能)引入了一些不直观的耦合。此外,如果A 覆盖foo,仍然会调用B 的foo。
恕我直言,一个有效的用例是conflict resolution:
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 声明 foo 时编译(但它可能在C 或A 中实现)。
【讨论】: