我正在使用Vapor 2并尝试创建非最终模型以将其子类化。可能吗?我有以下抽象模型的代码:
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)
}
}
但是出现了编译错误:
方法'make(for :)'在非final类'MongoObject'中必须返回
Self
符合协议'可参数化'
答案 0 :(得分:1)
你的非决赛"摘要"具有子类的模型符合Parameterizable
作为Model
一致性的一部分。可参数化需要返回Self
。默认情况下,这是通过从路径组件中读取实体的id来实现的。您现在遇到的问题是编译器无法为子类返回Self
,因为它是在更高的模型上实现的。
解决方案非常简单,你不能在这里进行子类化。
答案 1 :(得分:0)
我可能为时已晚,但我遇到了完全相同的问题,所有我必须做的就是让课程最终完成。
方法'make(for :)'在 非最终类 'MongoObject'必须返回Self以符合协议'Parameterizable'