Swift:重写同时也是父类属性类的子类属性

4

这似乎是一个难以表达的问题,但实际上很简单。我想做类似于这样的事情,但是Swift不允许:

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

2
D不是任何类的子类。您能再澄清一下您的问题吗? - Evdzhan Mustafa
@EvdzhanMustafa 哎呀,打错了,请现在检查。 - rolling_codes
@ThomMorgan,编译器具体在抱怨什么? - Loic Verrall
@LoicVerrall 编译器显示 无法使用协变类型 'B?' 覆盖可变属性 'prop' 的类型 'A?' - rolling_codes
2个回答

4
这里获取:

覆盖属性的getter和setter方法

您可以提供自定义getter(和setter,如果适用)来覆盖任何继承的属性,无论继承的属性在源代码中是实现为存储属性还是计算属性。子类不知道继承的属性是存储属性还是计算属性——它只知道继承的属性具有某个名称和类型。 您必须始终声明要覆盖的属性的名称和类型,以使编译器检查您的覆盖是否与具有相同名称和类型的超类属性匹配。

看起来好像你不能那样做。


那真的有点糟糕。 - rolling_codes
看起来至少对于非存储属性,它现在在Swift 4.2中得到了支持。 - rolling_codes

0

你所问的协变性/逆变性并没有一个明智的方法。想象一下这段代码:

func storeProperty(_ c: C) {
  c.prop = A()
}

let d = D()
storeProperty(d)
let b: B = d.prop

如果你的想法能够实现,我们会遇到类型错误——在运行时,一个类型为B的变量并不包含B!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接