如何重写Scala特性中的方法?

如何重写Scala特性中的方法?,scala,dependency-injection,traits,Scala,Dependency Injection,Traits,我有一个类,它混合了许多不同的特征,即给定各种可用的订单类型,匹配订单的编码行为。类定义如下所示 class DoubleAuctionMarket(val security: Security) extends EventBus { this: MatchingEngine => 基本匹配引擎的相关部分如下所示 trait MatchingEngine { /** Implements crossing logic for various types of orders. *

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

class DoubleAuctionMarket(val security: Security) extends EventBus {
  this: 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

}
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

}
我有另一个特性名为
limitOrderOnlyMachineEngine
,它扩展了基本特性,如下所示

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

}
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

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

不知道出了什么问题。我怀疑:

  • 我需要以某种方式覆盖
    limitOrderOnlyMachineEngine
  • 我需要在基类中为这些方法定义不同的输入类型
    想法?

    问题在于,从技术上讲,您没有在
    匹配引擎中实现这两种方法。特征指定:

    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
    …),但另一种方法是,因为你使用的是模式匹配,它只需要改变参数类型就可以了——尽管你可能想以某种方式涵盖其他的顺序类型

    我为类添加了存根,如
    Order
    LimitOrder
    等,下面的代码编译得很好:

    // 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
    
    //注意:订单不限于订单
    def交叉(传入:顺序,顶部:顺序):布尔={
    (传入,顶部)匹配{
    案例(传入:LimitOrderAsk,顶部:LimitOrderBid)=>
    进货限额
    incoming.limit>=top.limit
    }
    }
    //注:订单不限于订单
    def formPrice(传入:订单,顶部:订单):Double=0.0//注意需要模式匹配
    

    顺便说一句,Scala在金融领域取得了巨大进展。

    我有大量的订单类型,当我使用
    (传入:订单,顶部:订单)
    签名时,编译器会抱怨遗漏了案例,然后只对LimitOrder案例进行模式匹配。如果您添加一个名为
    MarketOrder
    的存根类,它从
    Order
    扩展而来,您将明白我的意思。使用泛型如何解决这个问题?嗯,我添加了
    类MarketOrder(val timeout:Int,override val qty:Int)扩展了Order(qty)
    ,它仍然运行正常。我正在使用Scala 2.10.3。不过我想到的一个想法是将模式匹配链接到默认处理,如
    def crosss(…):Boolean={…}或lse defaultcrosss(incoming,top)
    。我没有想到将模式匹配链接起来。这是个好主意。