У меня есть класс, который смешивает в нескольких разных чертах поведение кодирования для сопоставления заказов с учетом различных доступных типов ордеров. Определение класса выглядит следующим образом ...Как переопределить методы в признаке Scala?
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
или - мне нужно определить типы входных данных для этих методов в базовом классе по-разному.
Мысли?
У меня есть большое количество типов заказов, и компилятор жалуется на пропущенные случаи, когда я использую '(входящий: порядок, верх: порядок)' подпись, а затем только соответствие шаблону для случаев LimitOrder. Если вы добавите класс-заглушку под названием «MarketOrder», который простирается от «Order», вы увидите, что я имею в виду. Как решить проблему с помощью дженериков? – davidrpugh
Хмм, я добавил '' class MarketOrder (val timeout: Int, override val qty: Int) расширяет Order (qty) '', и он все еще работает нормально. Я использую Scala 2.10.3. –
Мысль, которая приходит в голову, хотя и связывает совпадение шаблонов с обработкой по умолчанию, например '' def crosses (...): Boolean = {...} илиElse defaultCrosses (incoming, top) ''. –