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