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

时间:2015-01-02 16:21:44

标签: scala dependency-injection traits

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

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

我被告知“对象创建是不可能的”,因为crosses方法和formPrice方法都没有按照我使用的自我类型注释的要求实现。

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

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

1 个答案:

答案 0 :(得分:0)

问题在于,您在技术上没有实现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正在进入金融界。