Swift:覆盖子类属性,这些属性也是父类属性类的子类



对单词来说似乎是一个令人困惑的问题,但实际上很简单。我想做这样的事情,但Swift不允许:

class A {}
class B : A {}
class C {
    var prop: A?
}
class D : C {
    override var prop : B?
}

取自此处:

覆盖属性获取器和设置器

您可以为覆盖任何继承的属性,无论继承的属性在源代码处实现为存储或计算的属性。继承属性的存储或计算性质不为子类——它只知道继承的属性具有名称和类型您必须始终说明属性,以使编译器能够检查override匹配具有相同名称和类型的超类属性

看来你做不到。

没有一种合理的方法可以满足您的要求,即协方差/反方差。想象一下这个代码:

func storeProperty(_ c: C) {
  c.prop = A()
}
let d = D()
storeProperty(d)
let b: B = d.prop

如果你的想法奏效了,我们有一个类型错误——一个类型为B的变量,在运行时不包含B!

最新更新