在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’),但是更改属性类?

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。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...