似乎是一个令人困惑的问题,但它实际上非常简单。我想做这样的事情,但斯威夫特不会允许它:
class A {}
class B : A {}
class C {
var prop: A?
}
class D : C {
override var prop : B?
}
答案 0 :(得分:4)
取自here:
覆盖属性获取者和设置者
您可以提供自定义getter(和setter,如果适用) 覆盖任何继承的属性,无论是否继承 property在源上实现为存储或计算属性。 继承属性的存储或计算性质未知 一个子类 - 它只知道继承的属性有一定的 名称和类型。 您必须始终说明名称和类型 你重写的属性,使编译器能够检查你的 override匹配具有相同名称和类型的超类属性。
好像你不能这样做。
答案 1 :(得分:0)
没有明智的方法来做你所要求的,即协方差/逆变。想象一下这段代码:
func storeProperty(_ c: C) {
c.prop = A()
}
let d = D()
storeProperty(d)
let b: B = d.prop
如果您的想法有效,我们会遇到类型错误 - 类型B的变量,在运行时不包含B!