在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'),但是更改属性类怎么办?
发布于 2014-06-07 14:12:45
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。
发布于 2014-06-12 20:52:14
这似乎行得通
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()
发布于 2017-05-25 17:53:05
试试这个:
class Chassis{
var chassis{
return "chassis"
}
}
class RacingChassis:Chassis{
var racing{
return "racing"
}
}
class Car<Type:Chassis> {
let chassis: Type
init(chassis:Type){
self.chassis = chassis
}
}
class RaceCar: Car<RacingChassis> {
var description{
return self.chassis.racing
}
}
然后:
let racingChassis = RacingChassis()
let raceCar = RaceCar(chassis:racingChassis)
print(raceCar.description) //output:racing
https://stackoverflow.com/questions/24094158
复制相似问题