Chcę utworzyć instancję obiektu, którego rodzaj zależy od danych środowiska wykonawczego:scala dynamicznie określana typ
trait Business
case class Business1() extends Business
case class Business2() extends Business
object Business {
def fromData(data:Array[Byte]): Business = data(0) match {
case 1 => new Business1
case 2 => new Business2
case _ => throw new RuntimeException("data error")
}
}
Powyższy kod może wykonywać swoje zadania, ale ma wątpliwości, że jest on zamknięty. Ilekroć implementuję nową podklasę Business
, będę musiał zmodyfikować kod Business.fromData
, np.
case 3 => new Business3
Jak mogę określić Business.fromData
raz i można później dodać Business3
, Business4
bez rejestracji do niego?
Edit
końcu zdałam sobie sprawę, że jest to idealny przypadek zastosowania Multimethod
, czyli dysponowanie na podstawie funkcji jakiegoś argumentu. Więc bardziej ogólne pytanie powinno brzmieć "Jak wykonać multimethod w scala"? Uważam, że wzorce projektowe istnieją tylko z powodu niemożności posługiwania się językiem, dlatego jestem niechętny akceptacji odpowiedzi opartej na fabrykacji.
Czy spalę w piekle za sugestię odbicia java? :) –