gpt4 book ai didi

swift - 在 Swift 中覆盖不同类型的父类(super class)属性

转载 作者:IT王子 更新时间:2023-10-29 04:55:58 25 4
gpt4 key购买 nike

在 Swift 中,有人可以解释如何使用从原始属性子类化的另一个对象覆盖父类(super class)的属性吗?

举个简单的例子:

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 覆盖它,反之亦然,这可能是因为父类(super class)实现可能不希望该属性在初始化后发生变化。因此,在这种情况下,需要在父类(super class)中使用“var”声明该属性,以匹配子类(如上面的代码片段所示)。如果无法更改父类(super class)中的源代码,那么最好销毁当前的 RaceCar,并在每次需要更改底盘时创建一个新的 RaceCar。

关于swift - 在 Swift 中覆盖不同类型的父类(super class)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24094158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com