求Scala trait交叉引用方法实现模式的官方文档来源
Scala 特质推导实现模式说明
你提到的这种设计在Scala中属于**骨架实现特质(Skeleton Implementation Trait)**的典型用法,官方文档中将其归类为特质作为「接口实现模板」的核心用例之一。
你给出的示例刚好是这类设计的最小验证实现:
trait Foo { def eq(x: Any): Boolean = !neq(x) def neq(x: Any): Boolean = !eq(x) } final class Bar extends Foo { override def eq(x: Any): Boolean = x.toString == "bar" }
当Bar重写了eq方法后,neq方法的默认实现就可以基于重写后的eq正常运行,不会触发循环调用。
这类设计的核心思路是利用Scala特质支持默认方法实现的特性,提前封装好非核心方法的通用推导逻辑:
- 特质中仅保留最小核心方法集作为需要子类实现的部分,其余方法都基于核心方法提供默认实现
- 当同一个逻辑存在多种实现路径时,就可以实现你示例中「子类任选一个方法重写即可获得完整能力」的效果
- Scala标准库中大量使用了这类设计,最典型的就是
scala.Equals特质:它的==、!=、哈希值计算方法全部基于核心的equals、canEqual方法推导得到,子类仅需要实现两个核心方法就能获得全套相等性判断能力
需要注意这类设计必须在文档中明确标注子类需要实现的最小方法集,否则如果子类没有重写任何核心方法,就会出现循环调用导致栈溢出的问题。
内容的提问来源于stack exchange,提问作者Aleksandr Vinokurov
相关产品推荐
相关产品推荐

