Dynamic
здесь ничего вам не дает, потому что он позволяет вам определять механизм обработки неопределенного метода. Однако в вашем примере все вызываемые методы определены.
На самом деле вам нужна механика нахождения метода, определенного в классе, и его не существует, потому что Dynamic
означает быть мостом к другим языкам JVM, которые могут реализовать их " методы »совершенно по-разному.
Все, что вам нужно сделать, это использовать отражение. Начиная с 2.9.1, Scala не имеет библиотеки отражений, но Java достаточно хорош для этой цели. Вот как бы вы написали AggregateRoot
:
abstract class AggregateRoot {
def applyChange(event: Event) {
this.getClass.getMethod("handleEvent", event.getClass).invoke(this, event)
}
}
Что Dynamic
позволит вам сделать это:
abstract class AggregateRoot extends Dynamic {
def applyDynamic(name : String)(args: Any*) =
this
.getClass
.getMethod(name, args map (_.getClass): _*)
.invoke(this, args map (_.asInstanceOf[Object]): _*)
}
А затем сделайте это в конце:
aggregate.handleEvent(event)
Где aggregate
, поскольку он имеет тип AggregateRoot
, а не InventoryItem
, не знает, что у него есть метод handleEvent
. Но я подозреваю, что это не то, что вы хотите.