所以我有一个基类:
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)
}
答案 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。