我有一个类,它混合了许多不同的特征,在给定各种可用订单类型的情况下匹配订单的编码行为。类定义如下所示......
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
方法都没有按照我使用的自我类型注释的要求实现。
不确定出了什么问题。我怀疑:
LimitOrderOnlyMatchingEngine
或思想?
答案 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
...)但另一种方式是因为你使用模式匹配,它会起作用只需更改参数类型 - 尽管您可能希望以这种或那种方式涵盖其他订单类型。
我为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
作为旁注,它的伟大Scala正在进入金融界。