在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'),但是如何更改属性类呢? ?


慕码人8056858
浏览 1433回答 3
3回答

白衣染霜花

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 newValue is RacingChassis {                racingChassis = newValue as RacingChassis            } else {                println("incorrect chassis type for racecar")            }        }    }}似乎无法使用let语法声明属性,而不能在其子类中用var覆盖它,反之亦然,这可能是因为超类实现可能不希望该属性一旦初始化就更改。因此,在这种情况下,还需要在超类中使用'var'声明属性,以匹配子类(如上面的代码段所示)。如果无法更改超类中的源代码,则可能最好在每次需要更改底盘时销毁当前的RaceCar并创建一个新的RaceCar。

慕森王

这似乎有效class Chassis {    func description() -> String {        return "Chassis"    }}class RacingChassis : Chassis {    override func description() -> String {        return "Racing Chassis"    }    func racingChassisMethod() -> String {        return "Wrooom"    }}class Car {    let chassis = Chassis()}class RaceCar: Car {    override var chassis: RacingChassis {    get {        return self.chassis    }    set {        self.chassis = newValue    }    }}var car = Car()car.chassis.description()var raceCar = RaceCar()raceCar.chassis.description()raceCar.chassis.racingChassisMethod()
打开App,查看更多内容
随时随地看视频慕课网APP