我正在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
时出现以下错误:
因为它在非参数、非结果类型位置使用'Self',所以协议'Ownee'的要求'owner'不能由非终极类('Student')满足。
我试图理解这个错误的原因,为什么将类Student
设为final可以修复它,并且是否有一些变通方法来以不同的方式对其进行建模,而不必使此类成为final。 我已经谷歌了这个错误,但到目前为止没有找到太多信息。
Student
子类化会发生什么?owner
属性仍然是Owner<Student>
,但是Student != StudentSubclass
。 - AlexanderStudent
符合Ownee
协议,其类型约束规定owner
必须是一个Owner<Self>
,其中Self
指代符合条件的类型Student
。子类化将违反此协议,因此不允许,编译器建议您将Student
声明为final。 - Alexander