Swift:覆盖子类属性,它们也是父类属性类的子类

时间:2016-04-17 13:39:04

标签: swift override subclass

似乎是一个令人困惑的问题,但它实际上非常简单。我想做这样的事情,但斯威夫特不会允许它:

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

2 个答案:

答案 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!