我想做这样的事情:
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")
Run Code Online (Sandbox Code Playgroud)
我不能,因为在getIt的上下文中,我没有告诉编译器每个Base都有一个'copy'方法,但copy也不是一个真正的方法所以我不认为有特征或抽象方法我可以放入Base以使其正常工作.或者,有吗?
如果我尝试将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类?一些特征意味着"具有案例类的属性"?
我可以让Base成为一个案例类,但后来我得到编译器警告,说不推荐使用case类继承吗?
我知道我也可以:
def getIt(f:Base)={
(f.getClass.getConstructors.head).newInstance("yeah").asInstanceOf[Base]
}
Run Code Online (Sandbox Code Playgroud)
但是......这看起来很难看.
思考?我的整个方法是"错误的"吗?
更新我更改了基类以包含属性,并使案例类使用"override"关键字.这更好地反映了实际问题,并考虑到Edmondo1984的响应使问题更加真实.