这似乎是一个难以表达的问题,但实际上很简单。我想做类似于这样的事情,但是Swift不允许:
class A {}
class B : A {}
class C {
var prop: A?
}
class D : C {
override var prop : B?
}
这似乎是一个难以表达的问题,但实际上很简单。我想做类似于这样的事情,但是Swift不允许:
class A {}
class B : A {}
class C {
var prop: A?
}
class D : C {
override var prop : B?
}
覆盖属性的getter和setter方法
您可以提供自定义getter(和setter,如果适用)来覆盖任何继承的属性,无论继承的属性在源代码中是实现为存储属性还是计算属性。子类不知道继承的属性是存储属性还是计算属性——它只知道继承的属性具有某个名称和类型。 您必须始终声明要覆盖的属性的名称和类型,以使编译器检查您的覆盖是否与具有相同名称和类型的超类属性匹配。
看起来好像你不能那样做。
你所问的协变性/逆变性并没有一个明智的方法。想象一下这段代码:
func storeProperty(_ c: C) {
c.prop = A()
}
let d = D()
storeProperty(d)
let b: B = d.prop
无法使用协变类型 'B?' 覆盖可变属性 'prop' 的类型 'A?'
。 - rolling_codes