cópia de classe de caso 'método' com superclasse
Eu quero fazer algo assim:
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")
Eu não posso, porque no contexto de getIt, eu não disse ao compilador que cada Base tem um método de 'cópia', mas a cópia não é realmente um método também, então eu não acho que há uma característica ou método abstrato Eu posso colocar na base para fazer isso funcionar corretamente. Ou está aí?
Se eu tentar definir Base comoabstract class Base{ def copy(myparam:String):Base }
, entãocase class Foo(myparam:String) extends Base
resulta emclass Foo needs to be abstract, since method copy in class Base of type (myparam: String)Base is not defined
Existe alguma outra maneira de dizer ao compilador que todosBase
classes serão classes de casos em sua implementação? Alguma característica que significa "tem as propriedades de uma classe de caso"?
Eu poderia fazer o Base ser uma classe de caso, mas então eu recebo avisos de compilador dizendo que a herança de classes de casos está obsoleta?
Eu sei que também posso:
def getIt(f:Base)={
(f.getClass.getConstructors.head).newInstance("yeah").asInstanceOf[Base]
}
mas ... isso parece muito feio.
Pensamentos? Toda a minha abordagem é apenas "errada"?
ATUALIZAR Alterei a classe base para conter o atributo e fiz com que as classes de caso usassem a palavra-chave "override". Isso reflete melhor o problema real e torna o problema mais realista em consideração à resposta de Edmondo1984.