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

发布于 2021-01-31 23:53:59

在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’),但是如何更改属性类呢? ?

关注者
0
被浏览
105
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    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。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看