为了账号安全,请及时绑定邮箱和手机立即绑定

在Swift中使用不同类型覆盖超类属性

在Swift中使用不同类型覆盖超类属性

慕码人8056858 2019-11-12 12:46:33
在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'),但是如何更改属性类呢? ?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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。

查看完整回答
反对 回复 2019-11-12
?
慕森王

TA贡献1777条经验 获得超3个赞

这似乎有效


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()


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 1432 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信