2015-01-02 2 views
1

У меня есть класс, который смешивает в нескольких разных чертах поведение кодирования для сопоставления заказов с учетом различных доступных типов ордеров. Определение класса выглядит следующим образом ...Как переопределить методы в признаке 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 были выполнены в соответствии с требованиями собственной аннотации типа я использовал.

Не уверен, что происходит. Я подозреваю, что либо:

  1. мне нужно каким-то образом переопределить соответствующие методы в LimitOrderOnlyMatchingEngine или
  2. мне нужно определить типы входных данных для этих методов в базовом классе по-разному.

Мысли?

ответ

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 добиваются успехов в финансовом мир.

+0

У меня есть большое количество типов заказов, и компилятор жалуется на пропущенные случаи, когда я использую '(входящий: порядок, верх: порядок)' подпись, а затем только соответствие шаблону для случаев LimitOrder. Если вы добавите класс-заглушку под названием «MarketOrder», который простирается от «Order», вы увидите, что я имею в виду. Как решить проблему с помощью дженериков? – davidrpugh

+0

Хмм, я добавил '' class MarketOrder (val timeout: Int, override val qty: Int) расширяет Order (qty) '', и он все еще работает нормально. Я использую Scala 2.10.3. –

+0

Мысль, которая приходит в голову, хотя и связывает совпадение шаблонов с обработкой по умолчанию, например '' def crosses (...): Boolean = {...} илиElse defaultCrosses (incoming, top) ''. –

Смежные вопросы