一尘不染

在Swift中使用不同类型覆盖超类属性

swift

在Swift中,有人可以解释如何用原始属性的子类覆盖另一个超类的属性吗?

举一个简单的例子:

class Chassis {}
class RacingChassis : Chassis {}

class Car {
    let chassis = Chassis()
}
class RaceCar: Car {
    override let chassis = RacingChassis() //Error here
}

这给出了错误:

Cannot override with a stored property 'chassis'

如果我将机箱设为“ var”,则会收到错误消息:

Cannot override mutable property 'chassis' of type 'Chassis' with covariant type 'RacingChassis'

在指南中“覆盖属性”下唯一可以找到的内容表明,我们必须覆盖getter和setter,这可能会更改属性的值(如果它是’var’),但是如何更改属性类呢? ?


阅读 363

收藏
2020-07-07

共1个答案

一尘不染

Swift不允许您更改任何变量或属性的类类型。相反,您可以在子类中创建一个额外的变量来处理新的类类型:

class Chassis {}
class RacingChassis : Chassis {}

class Car {
    var chassis = Chassis()
}
class RaceCar: Car {
    var racingChassis = RacingChassis()
    override var chassis: Chassis {
        get {
            return racingChassis
        }
        set {
            if let newRacingChassis = newValue as? RacingChassis {
                racingChassis = newRacingChassis
            } else {
                println("incorrect chassis type for racecar")
            }
        }
    }
}

似乎无法使用let语法声明属性并在其子类中用var覆盖它,反之亦然,这可能是因为超类实现可能不希望该属性一旦初始化就更改。因此,在这种情况下,还需要在超类中用’var’声明属性,以匹配子类(如上面的代码段所示)。如果无法更改超类中的源代码,则可能最好在每次需要更改底盘时销毁当前的RaceCar并创建一个新的RaceCar。

2020-07-07