2017-09-26 3 views
2

J'utilise Vapor 2 et essaye de créer un modèle non-final pour le sous-classer. C'est possible? J'ai le code suivant pour le modèle abstrait:Vapor 2, sous-classe de modèle 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) 
    } 

} 

mais nous avons eu erreur de compilation:

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

Répondre

1

Votre non-modèle final "abstrait" avec des sous-classes est conforme à Parameterizable dans le cadre de la conformité Model. Parameterizable nécessite le retour Self. Par défaut, ceci est implémenté en lisant l'identifiant de l'entité à partir du composant path. Le problème que vous obtenez maintenant est que le compilateur ne peut pas retourner Self pour les sous-classes car il est implémenté sur un modèle supérieur.

La solution est assez simple, vous ne pouvez pas faire de sous-classe ici.

0

J'ai peut-être été trop tard, mais j'avais exactement le même problème et tout ce que j'avais à faire était de rendre la classe finale.

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