Стандартный способ реализации динамической диспетчеризации для одного аргумента — это объектно-ориентированный полиморфизм:
abstract class SuperClazz() {
def method(): ReturnType
}
case class SubClazz1() extends SuperClazz {
def method() = {
// stuff
}
}
case class SubClazz2() extends SuperClazz {
def method() = {
// stuff
}
}
// Alternatively just `def func(obj: SuperClazz) =` in this case
def func[T <: SuperClazz](obj: T) =
obj.method()
Имейте в виду, что вы не можете расширить case class
другим case class
, и обычно считается плохим стилем вообще расширять case class
es. Чтобы реализовать это, вам, вероятно, понадобится method
, чтобы быть абстрактным в SuperClazz
, и, таким образом, SuperClazz
должно быть trait
или abstract class
.
Другой распространенной альтернативой динамической диспетчеризации в scala является сопоставление с образцом:
sealed abstract class SuperClazz()
case class SubClazz1() extends SuperClazz
case class SubClazz2() extends SuperClazz
def method(obj: SubClazz1) = {
// stuff
}
def method(obj: SubClazz2) = {
// stuff
}
def func(obj: SuperClazz) =
obj match {
case sc1: SubClazz1 => method(sc1)
case sc2: SubClazz2 => method(sc2)
}
Подобное сопоставление шаблонов обычно реализуется, когда суперкласс или трейт sealed
(в этот случай sealed abstract class SuperClazz()
). При сопоставлении объектов запечатанных суперклассов компилятор проверит, что вы указали все возможности в сопоставлении, чтобы гарантировать отсутствие ошибки времени выполнения при сопоставлении. Компилятор выдаст вам предупреждение, если вы забудете указать некоторые возможности.
Сопоставление шаблонов также работает для динамической диспетчеризации с несколькими аргументами, но по сравнению с полиморфизмом они обычно требуют написания большего количества стандартного кода и могут иметь более высокие затраты производительности во время выполнения для линейного тестирования каждого случая совпадения и вызова unapply
функций.
person
Kolmar
schedule
27.02.2016
SuperClazz
, и есть 2 метода, один для каждого подкласса. Откуда я знаю, что найти? - person pedrorijo91   schedule 27.02.2016