在两个mixin的交集处覆盖特征函数

问题描述

问题是,当实现两个已知特征时,是否有任何方法(不涉及反射黑魔法)隐式覆盖方法

假设我们有一个SysImpl,它实现了两个 mixin:SystemContainer

// Where system acts as the interface for another consumer
trait System {
  def isEmpty = false
}

trait Container[A] {
  val elements = mutable.Set[A]()
}

// Then,we typically implement:
class SysImpl extends System with Container[Int] {
  // We override the default system implementation here
  override def isEmpty = elements.isEmpty
}

举个例子。 是否有任何方法可以实现第三个特征,或者对原始特征进行一些修改,从而使实现隐式覆盖 isEmpty 方法,以防存在 SystemContainer[A]

我想到的第一件事是创建一个扩展方法,但这将是最好的阴影(不是吗?)。我需要正确覆盖该方法,因为调用是由只看到 System 的消费者调度的。

(示例,省略细节)

class aimpl extends System with Container[A]

object Consumer {
  def consume(sys: System) = if (sys.isEmpty) { /* Do things */ }
}

// Somewhere...
object Main {
  def main() = {
    Consumer.consume(new aimpl)
  }
}

解决方法

  trait Mix[A] extends Container[A] with System {
    override def isEmpty = elements.isEmpty
  }