【发布时间】:2016-09-05 13:57:30
【问题描述】:
我正在为 Swift 上的所有者/所有者方案建模:
class Owner<T: Ownee> {
// ...
}
protocol Ownee {
var owner: Owner<Self> { get }
}
然后我有一对遵循上述建模类型的教授/学生:
class Professor: Owner<Student> {
// ...
}
class Student: Ownee {
let professor: Professor
var owner: Owner<Student> { // error here (see below)
return professor
}
init(professor: Professor) {
self.professor = professor
}
}
但是我在Student 类中对var owner 的定义出现以下错误:
协议 'Ownee' 要求 'owner' 不能满足 非最终类('Student'),因为它在非参数中使用'Self', 非结果型职位
我试图了解导致此错误的原因是什么,为什么将 Student 类设为 final 会修复它,以及是否有一些解决方法能够以不同的方式对此进行建模,而不会使此类成为最终类。我已经用谷歌搜索过这个错误,但到目前为止还没有找到太多。
【问题讨论】:
-
如果
Student被子类化会怎样?owner属性仍然是Owner<Student>,但Student != StudentSubclass -
@AMomchilov 这是真的,但这是个问题吗?如果是这样,为什么?
-
是的,因为
Student符合Ownee协议,其类型约束规定owner必须是Owner<Self>,其中Self指的是符合类型,Student。子类化会违反这个契约,因此不能被允许,所以编译器建议你将Student设为final。
标签: swift oop generics swift-protocols