Powiedz, że mam dwie cechy, które chciałbym wymieszać z klasą. Każdy z nich stosuje abstrakcyjną metodę, której potrzebuje klasa.Cechy i serializacja/deserializacja
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
}
można następnie skonstruować betonu M z A lub B i serializacji:
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
wszystko działa prawidłowo. Ale w jaki sposób deserializować obiekty przy jednoczesnym poszanowaniu typu cechy, która jest mieszana z M? Mógłbym wypisać nazwę cechy w metodzie serializacji, a następnie M odserializował wysłanie metody na nazwę, ale co, jeśli mam klasy inne niż M, w które można mieszać A i B? Następnie każda klasa musiałaby duplikować zachowanie deserializatora M wysyłania. Problem staje się jeszcze gorszy, jeśli mam wiele cech, które muszą zostać zmiksowane w obiekt, aby był konkretny i każdy ma własną niestandardową serializację/deserializację. Ktoś rozwiązuje taki problem?
To nie jest dla mnie jasne, w jaki sposób te biblioteki wybrać cecha do wstawek do klasy na deserializacji. Czy możesz mi wyjaśnić, w jaki sposób framework wybiera pomiędzy "z A" lub "z B"? – AnthonyF
Zatem cecha A i cecha B zawierają różne implementacje metody abstrakcyjnej w klasie M. Zmieniłem to pytanie, aby odzwierciedlić ten fakt. Szukam komponowania obiektu z zachowaniem zdefiniowanym w cechach i umożliwienia serializacji i deserializacji tego obiektu. Innymi słowy konkretna instancja M to nie tylko klasa danych. Ma określone zachowanie. – AnthonyF
W przypadku deserializacji/umarshaling należy umieścić implementację poza klasą, ponieważ obiekt jeszcze nie istnieje. Pokazałem sposób implementacji tego poprzez użycie typeclass, ale można to również zrobić za pomocą obiektu towarzyszącego, jeśli chcesz. –