Я хочу сделать что-то вроде этого:
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")
Я не могу, потому что в контексте getIt я не сказал компилятору, что каждая Base имеет метод "copy", но копия на самом деле не является методом, поэтому я не думаю, что есть черта или абстрактный метод, который я могу поместить в базу, чтобы сделать эту работу должным образом. Или, есть?
Если я попытаюсь определить Base как abstract class Base{ def copy(myparam:String):Base }
, то case class Foo(myparam:String) extends Base
приведет к class Foo needs to be abstract, since method copy in class Base of type (myparam: String)Base is not defined
Есть ли другой способ сообщить компилятору, что все классы Base
будут классами case в их реализации? Некоторая черта, которая означает "имеет свойства класса case"?
Я мог бы сделать Base классом case, но тогда я получаю предупреждения компилятора, говорящие, что наследование от классов case устарело?
Я знаю, что могу также:
def getIt(f:Base)={
(f.getClass.getConstructors.head).newInstance("yeah").asInstanceOf[Base]
}
но... это кажется очень уродливым.
Мысли? Является ли весь мой подход "неправильным"?
ОБНОВЛЕНИЕ Я изменил базовый класс, чтобы содержать атрибут, и сделал классы case использующими ключевое слово "переопределить". Это лучше отражает реальную проблему и делает проблему более реалистичной с учетом ответа Edmondo1984.