說我有兩個特性,我想混入一個類。每個特徵都實現了類需要的抽象方法。性狀和序列化/反序列化
trait Writable {
def serialize(out: java.io.DataOutput)
}
trait T1 extends Writable
trait A extends T1 {
val aNum: Int
abstract override def serialize(out: java.io.DataOutput) = {
super.serialize(out)
println("A serialize")
out.writeInt(aNum)
}
def action = println("A action")
}
trait B extends T1 {
val bNum: Int
abstract override def serialize(out: java.io.DataOutput) = {
super.serialize(out)
println("B serialize")
out.writeInt(bNum)
}
def action = println("B action")
}
abstract class M[CT1 <: T1](val mNum: Int) extends Writable {
this: M[CT1] with T1 =>
def serialize(out: java.io.DataOutput) = {
println("M serialize")
out.writeInt(mNum)
}
def action
}
我可以然後構造一個混凝土米,A或B和序列:
scala> val m1 = new M[A](10) with A { val aNum = 20 }
m1: M[A] with A = [email protected]
scala> val m2 = new M[B](20) with B { val bNum = 30 }
m2: M[B] with B = [email protected]
scala> val out = new java.io.DataOutputStream(new java.io.ByteArrayOutputStream())
out: java.io.DataOutputStream = [email protected]
scala> m1.serialize(out)
M serialize
A serialize
scala> m2.serialize(out)
M serialize
B serialize
一切正常。但是,在尊重混入M中的特徵類型的同時如何反序列化這些對象呢?我可以在序列化方法中輸出特徵的名稱,然後在名稱上使用M的反序列化方法調度,但是如果我有除M以外的類A和B可以混合的類,該怎麼辦?然後,每個類將不得不重複M的調度反序列化的行爲。如果我有多個特徵需要混合到一個對象中以使其具體化,並且每個特徵都有自己的自定義序列化/反序列化,則問題會變得更加嚴重。任何人都可以解決這樣的問題?
這是我不清楚這些庫如何選擇哪個性狀混入到反序列化的類。您能否向我解釋框架如何在「與A」或「與B」之間選擇? – AnthonyF
因此特質A和特質B包含M類中抽象方法的不同實現。我編輯了這個問題以反映這一事實。我正在尋找組成具有特性中定義的行爲的對象,並允許對該對象進行序列化和反序列化。換句話說,具體的M實例不僅僅是一個數據類。它有特定的行爲。 – AnthonyF
隨着反序列化/取消編組,你需要將實現放在類之外,因爲對象還不存在。我已經通過使用typeclass演示了一種實現方法,但如果您願意,也可以使用伴隨對象來實現此目的。 –