如何覆盖 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 类型注释的要求实现。
不确定出了什么问题。我怀疑:
- 我需要以某种方式覆盖
LimitOrderOnlyMatchingEngine
或 中的相关方法
- 我需要为基础 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
...)但另一种方法是因为你使用的是模式匹配,它会起作用只需更改参数类型 - 尽管您可能希望以某种方式涵盖其他订单类型。
我为 类 添加了存根,例如 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 在金融领域取得进展真是太好了。
我有一个 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 类型注释的要求实现。
不确定出了什么问题。我怀疑:
- 我需要以某种方式覆盖
LimitOrderOnlyMatchingEngine
或 中的相关方法
- 我需要为基础 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
...)但另一种方法是因为你使用的是模式匹配,它会起作用只需更改参数类型 - 尽管您可能希望以某种方式涵盖其他订单类型。
我为 类 添加了存根,例如 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 在金融领域取得进展真是太好了。