我們正在使用雙向json請求和this algorithm構建一些同步功能。一切都很好,我們有它在原型模式下運行。現在我試圖對代碼進行泛化,因爲我們將在應用程序中同步多個表。能夠將一個類定義爲「extends Synchable」並通過一些專門化/覆蓋獲得附加屬性和同步處理方法將會很酷。我有這麼遠:通用同步設計
abstract class Synchable [T<:Synchable[T]] (val ruid: String, val lastSyncTime: String, val isDeleted:Int) {
def contentEquals(Target: T): Boolean
def updateWith(target: T)
def insert
def selectSince(clientLastSyncTime: String): List[T]
def findByRuid(ruid: String): Option[T]
implicit val validator: Reads[T]
def process(clientLastSyncTime: String, updateRowList: List[JsObject]) = {
for (syncRow <- updateRowList) {
val validatedSyncRow = syncRow.validate[Synchable]
validatedSyncRow.fold(
valid = { result => // valid row
findByRuid(result.ruid) match { //- do we know about it?
case Some(knownRow) => knownRow.updateWith(result)
case None => result.insert
}
}... invalid, etc
我是新來的斯卡拉,知道我可能會錯過的東西 - WIP!
任何關於這種方法的指針或建議將不勝感激。
感謝您的堅實建議 - 我已經將它們與編輯結合起來。我現在在驗證時遇到問題。 'validator'現在的類型是'Reads [Synchable.this.T]',但是當我用'implicit val validator:Reads [Teacher] ...'實現它時,教師擴展了Synable,我得到一個不兼容類型的錯誤, 「重寫類型爲play.api.libs.json.Reads [Teacher.this.T]的類Synable中的值驗證器;值驗證器具有不兼容類型」,這是我不明白的。當然'Teacher.this.T'與它的超類型'Synchable.this.T'兼容? – wwkudu
當我爲上述定義具體類時,似乎我遇到的問題是因爲它是一個F-界多態的例子(參見[這裏](http://twitter.github.io/scala_school/advanced-types)。 html),[here](http://stackoverflow.com/questions/16256965/f-bound-polymorphism-with-abstract-types-instead-of-parameter-types)和[here](http:// stackoverflow例如)/ 14067406/f-bounded-polymorphism-in-scala)。因此,將簽名更改爲'abstract class Synchable [T <:Synchable [T]]',具體定義爲'class Foo extends Synchable [Foo]'等。再次感謝。 – wwkudu