2017-09-26 49 views
2

我正在使用Vapor 2並試圖創建非最終模型來對其進行子類化。可能嗎?我有下面的代碼抽象模型:Vapor 2,Fluent模型子類

class MongoObject: Model, JSONRepresentable { 

    let storage = Storage() 

    let creationDate: Date 

    init() { 
     creationDate = Date() 
    } 

    required init(row: Row) throws { 
     creationDate = try row.get(KeyPath.creationDate) 
    } 

    func makeRow() throws -> Row { 
     var row = Row() 
     try row.set(KeyPath.creationDate, creationDate) 
     return row 
    } 

    func makeJSON() throws -> JSON { 
     var json = JSON() 
     try json.set(KeyPath.id, id) 
     try json.set(KeyPath.creationDate, creationDate) 
     return json 
    } 

} 

extension MongoObject: Preparation { 

    class func prepare(model: Creator) { } 

    static func prepare(_ database: Database) throws { 
     try database.create(self) { (builder) in 
      builder.id() 
      builder.date(KeyPath.creationDate) 
      prepare(model: builder) 
     } 
    } 

    static func revert(_ database: Database) throws { 
     try database.delete(self) 
    } 

} 

,但得到的編譯錯誤:

method 'make(for:)' in non-final class 'MongoObject' must return Self to conform to protocol 'Parameterizable'

回答

1

你非最後的「抽象」的模型,子類是符合ParameterizableModel一致性的一部分。可參數化要求返回Self。默認情況下,這是通過從路徑組件中讀取實體的ID來實現的。你現在得到的問題是編譯器不能爲子類返回Self,因爲它是在更高級的模型上實現的。

解決方案非常簡單,你不能在這裏進行子類化。

0

我可能已經太晚了,但是我遇到了完全相同的問題,我所要做的就是讓課程最終成功。

method 'make(for:)' in non-final class 'MongoObject' must return Self to conform to protocol 'Parameterizable'