在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。