2017-03-06 10 views
0

に準拠していません。不正な継承。セルフタイプ....私は、コードのようなケーキのパターンを実装しようとしていますが、私が得る

Error:(47, 36) illegal inheritance; 
self-type app.server.im.Im_Api_Service_Impl.type does not conform to app.server.im.Persistence[app.server.im.State.State]'s selftype app.server.im.Persistence[app.server.im.State.State] with app.server.im.Persistable[app.server.im.State.State] 
object Im_Api_Service_Impl extends Persistence[State.State] 

以下のコードで。

何が問題なのですか?

私はthis SOF質問を見ましたが、それは異なる風景を記述しているようです(または、おそらく私は類似性を見ていないだけです)。 trait Persistence[State] { this:Persistable[State]

import app.shared.IndexChange 
import app.shared.apiAndModel.im.{CanCreateEntity, Im_Api_Interface, LineShared, LineSharedPayload, UUID} 
import upickle.default._ 
object State { 
    type State = Seq[LineShared] 
} 

trait Im_Api_Service extends Im_Api_Interface with Persistable[State.State] { 
    implicit object CanCreate extends CanCreateEntity 
    import State.State 
    val init = List("egy", "ketto", "harom", "negy", "ot", "hat", "het", "nyolc").map(LineSharedPayload(_)).map(LineShared(_)) 

    val fileNameForPersistence="state" 

    var state: State = init 

    def setState(s:State)={state=s} 

    override def getLines(): Seq[LineShared] = state 


    def moveLine(ls: State, from: Int, to: Int): Seq[LineShared] = { 
    val r=IndexChange(from, to).updatedList[LineShared](ls.toList) 
    r 
    } 

    override def moveLine(from: Int, to: Int): Seq[LineShared] = {state=moveLine(state, from, to);state;} 

    override def newLine(pl: LineSharedPayload): Seq[LineShared] = { 
    setState(state :+ LineShared(pl)) 
    state 
    } 

    def getLine(ls:State, id: UUID): Option[LineShared] = ls.find(_.id == id) 

    override def getLine(id: UUID): Option[LineShared] = getLine(state,id) 


    override def updateLine(l: LineShared): State = { 
    setState(state.map(ll => if (ll~l) l else ll)) 
    state 
    } 
} 

object Im_Api_Service_Impl extends Persistence[State.State] 

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
       illegal inheritance problem HERE 


trait Persistable[State] 
{ 
    val fileNameForPersistence:String 
    var state :State 

} 

trait Persistence[State] { this:Persistable[State] => 
    def serializeState(s: State): String = write(s) 

    // TODO add timestamp to filename 
    def saveState(): Unit = writeToFile(serializeState(state), fileNameForPersistence) 

    def loadState(): Unit = { 
    try { 
     state = deserializeState(readFromFile(fileNameForPersistence)) 
    } 
    catch { 
     case e: Exception => println(e) 
    } 
    } 

    def writeToFile(s: String, fn: String): Unit = { 
    import java.io._ 
    val pw = new PrintWriter(new File(fn)) 
    pw.write(s) 
    pw.close 
    } 


    def readFromFile(fn: String): String = { 
    val source = scala.io.Source.fromFile(fn) 
    val lines: String = try source.mkString finally source.close() 
    lines 
    } 

    def deserializeState(s: String): State = read[State](s) 
} 
+0

問題を解決しました:) – jhegedus

+0

オブジェクトIm_Api_Service_Implから永続性[State.State]を拡張するには、Im_Api_Serviceからも拡張する必要があります。 – jhegedus

+0

それは、 'this:Persistable [State] =>'という句がうまく見えます。 'Persistence [State]'が 'Persistable [State]'の亜特徴であるならば、それはちょうど 'trait Persistence [State]がPersistable [State]を拡張するものでなければなりません。また、 "self"が必要な場合は 'self => ...'を使ってください。 'this => ...'ではなく – eje

答えて

2

あなただけPersistableを拡張するクラスに混入されるという特性Persistenceを約束しています。

代わりに、オブジェクトはPersistence[State.State]に拡張されます。それは同じことですか?

+0

ええ、それは問題だった!コメントありがとう – jhegedus

+1

'Im_Api_Service_Implは永続性[State.State]でIm_Api_Serviceを拡張します' – jhegedus

関連する問題