如何重写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)
。我没有想到将模式匹配链接起来。这是个好主意。