case class copy 'method' z superklasą
Chcę zrobić coś takiego:
sealed abstract class Base(val myparam:String)
case class Foo(override val myparam:String) extends Base(myparam)
case class Bar(override val myparam:String) extends Base(myparam)
def getIt( a:Base ) = a.copy(myparam="changed")
Nie mogę, ponieważ w kontekście getIt nie powiedziałem kompilatorowi, że każda baza ma metodę „kopiowania”, ale kopia nie jest tak naprawdę metodą, więc nie sądzę, aby istniała cecha lub metoda abstrakcyjna Mogę umieścić w bazie, aby to działało poprawnie. Czy istnieje?
Jeśli spróbuję zdefiniować bazę jakoabstract class Base{ def copy(myparam:String):Base }
, następniecase class Foo(myparam:String) extends Base
prowadzi doclass Foo needs to be abstract, since method copy in class Base of type (myparam: String)Base is not defined
Czy jest jakiś inny sposób, aby powiedzieć kompilatorowi, że wszystkoBase
klasy będą klasami przypadków w ich implementacji? Jakaś cecha, która oznacza „ma właściwości klasy przypadku”?
Mogę sprawić, że Base będzie klasą sprawy, ale wtedy otrzymuję ostrzeżenia kompilatora mówiące, że dziedziczenie z klas przypadków jest przestarzałe?
Wiem, że mogę również:
def getIt(f:Base)={
(f.getClass.getConstructors.head).newInstance("yeah").asInstanceOf[Base]
}
ale ... to wydaje się bardzo brzydkie.
Myśli? Czy całe moje podejście jest „złe”?
AKTUALIZACJA Zmieniłem klasę bazową, aby zawierała atrybut, i użyłem klasy case do użycia słowa kluczowego „override”. To lepiej odzwierciedla rzeczywisty problem i sprawia, że problem jest bardziej realistyczny, biorąc pod uwagę odpowiedź Edmondo1984.