Scala中case object如何继承多层抽象类?代码报错怎么修复?
修复Scala多层抽象类继承的case object错误
错误原因
你遇到的问题是:初始化case object Foo时,调用父类B(a)构造器的时机早于子类内部val a = 5的定义,编译器此时找不到a的值;同时原代码中抽象类A、B的构造器参数未加val修饰,属于私有成员,子类无法继承访问。
修复方案
因为case object是单例实例,属性值固定,直接将常量值5传入父类B的构造器即可。同时给抽象类的构造器参数添加val,让子类能继承访问该属性:
object Main { sealed abstract class A(val a: Int) sealed abstract class B(val a: Int) extends A(a) // 直接传入固定值5给B的构造器,子类可继承B的a属性 case object Foo extends B(5) case class Bar(a: Int) extends A(a) }
如果确实需要在Foo内部显式重写a(实际没必要,因为值固定),可以这样写:
case object Foo extends B(5) { override val a = 5 }
补充说明
- 抽象类构造器参数加
val后,会成为类的公有成员变量,子类可直接继承使用。 case object是单例,无法像case class那样接收外部参数,因此父类构造器必须传入固定常量。
内容的提问来源于stack exchange,提问作者The Unfun Cat
相关产品推荐
相关产品推荐

