简化在Scala中从其父级构造子类

时间:2014-02-28 01:45:49

标签: scala inheritance

所以我有一个基类:

case class CSVRecord (
  val timestamp : String,
  val transactionId : String,
  val action : String,
  val fromMSISDN :String,
  val toMSISDN :String,
  val fromICCID :String,
  val toICCID :String,
  val finalState :String,
  val reason : String,
  val source : String
)

它有一个自己的子类,我偶尔需要用它的父实例进行初始化。有更简单的方法吗?现在我必须重复每个字段并再次分配它。在Scala中有更简单/更清晰的方法吗?

class Record (
  val id : Long,
  val batch_id : Long,

  timestamp : String,
  transactionId : String,
  action : String,
  fromMSISDN :String,
  toMSISDN :String,
  fromICCID :String,
  toICCID :String,
  finalState :String,
  reason : String,
  source : String

) extends     CSVRecord(timestamp,transactionId,action,fromMSISDN,toMSISDN,fromICCID,toICCID,finalState,reason,source) with KeyedEntity[Long] {
  def this() = this(0,0,"","","","","","","","","","")
  def this(id : Long, batch_id : Long, r : CSVRecord) = this(id,batch_id,r.timestamp,
    r.transactionId,r.action,r.fromMSISDN,r.toMSISDN,r.fromICCID,r.toICCID,r.finalState,r.reason,r.source)

  lazy val provisionings : OneToMany[Provisioning] = MWS.recordToProvisioning.left(this)
  lazy val batch : ManyToOne[Batch] = MWS.batchToRecord.right(this)
}

2 个答案:

答案 0 :(得分:1)

为什么不将一些相关字段收集到值对象(case class)中?这将大大减少你的子类的写作。

答案 1 :(得分:1)

您无法避免指定所有构造函数参数。如果符合您的需求,一个“解决方法”是使用def而不是val

trait A {
  def a: Int = 1
  def b: String = "text"
}

class B extends A

只有当你有大多数吸气者而非主持人时,这才有效。

将@ MK378建议的字段组合在一起也是一个很好的解决方案:

trait BaseType

case class SharedArgs(a: Int, b: String)

case class A(args: SharedArgs) extends BaseType

case class B(args: SharedArgs, anotherArg: Int) extends BaseType

它不仅减少了代码重复,而且还使代码更容易阅读 - 很容易迷失这么多args。