2017-03-06 1 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로부터 확장해야합니다. Im_Api_Service_Impl은 지속성을 확장합니다. [State.State] ... ... 무슨 초급 실수입니까! – jhegedus

+0

'this : Persistable [State] =>'절은 어색해 보인다. 'Persistence [State]'가 'Persistable [State]'의 하위 형질이라면 그것은 단지 '특성 지속성 [State]가 Persistable [State]를 확장해야한다. 또한, "self"가 필요하다면'self => ...'를 사용하십시오.'this => ... '가 아닙니다. – eje

답변

2

Persistable를 확장하는 클래스로 혼합 될 것이라고 특성 Persistence을 약속했다.

대신 개체가 Persistence[State.State]까지 확장됩니다. 그게 똑같은가요?

+0

예, 그게 문제였습니다! 주석을 주신 덕분에 – jhegedus

+1

'Im_Api_Service_Impl은 Im_Api_Service를 Persistence [State.State]'로 확장합니다. – jhegedus