如何覆盖 Scala 特征中的方法?

How to override methods in a Scala trait?

我有一个 class,它混合了许多不同的特征,即在给定各种可用订单类型的情况下匹配订单的编码行为。 class 定义如下所示...

class DoubleAuctionMarket(val security: Security) extends EventBus {
  this: MatchingEngine =>

基础 MatchingEngine 特征的相关部分如下所示...

trait MatchingEngine {

  /** Implements crossing logic for various types of orders. */
  def crosses(incoming: Order, top: Order): Boolean

  /** Implements price formation rules for various types of orders. */
  def formPrice(incoming: Order, top: Order): Double

}

我有另一个名为 LimitOrderOnlyMatchingEngine 的特征,它扩展了基本特征,如下所示...

trait LimitOrderOnlyMatchingEngine extends MatchingEngine {

  def crosses(incoming: LimitOrder, top: LimitOrder): Boolean = {

    (incoming, top) match {
      case (incoming: LimitOrderAsk, top: LimitOrderBid) =>
        incoming.limit <= top.limit
      case (incoming: LimitOrderBid, top: LimitOrderAsk) =>
        incoming.limit >= top.limit
    }

  }

  def formPrice(incoming: LimitOrder, top: LimitOrder): Double = top.limit

}

现在,当我尝试使用

混入 LimitOrderOnlyMatchingEngine
new DoubleAuctionMarket(security) with LimitOrderOnlyMatchingEngine

我被告知 "object creation is impossible" 因为 crosses 方法和 formPrice 方法都没有按照我使用的 self 类型注释的要求实现。

不确定出了什么问题。我怀疑:

  1. 我需要以某种方式覆盖 LimitOrderOnlyMatchingEngine
  2. 中的相关方法
  3. 我需要为基础 class 中的那些方法定义不同的输入类型。

想法?

问题是您在技术上没有在 MatchingEngine 特征中实现这两个方法。特征指定:

def crosses(incoming: Order, top: Order): Boolean
def formPrice(incoming: Order, top: Order): Double

但是你实现了:

def crosses(incoming: LimitOrder, top: LimitOrder): Boolean
def formPrice(incoming: LimitOrder, top: LimitOrder): Double

你可以用泛型解决它(我不记得它是 +Order 还是 -Order ...)但另一种方法是因为你使用的是模式匹配,它会起作用只需更改参数类型 - 尽管您可能希望以某种方式涵盖其他订单类型。

我为 类 添加了存根,例如 OrderLimitOrder 等,下面的编译很好:

// NOTE: Order not LimitOrder
def crosses(incoming: Order, top: Order): Boolean = {
  (incoming, top) match {
    case (incoming: LimitOrderAsk, top: LimitOrderBid) =>
      incoming.limit <= top.limit
    case (incoming: LimitOrderBid, top: LimitOrderAsk) =>
      incoming.limit >= top.limit
  }
}

// NOTE: Order not LimitOrder
def formPrice(incoming: Order, top: Order): Double = 0.0 // Note pattern matching needed

附带说明一下,Scala 在金融领域取得进展真是太好了。