首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >覆盖Swift中不同类型的超类属性

覆盖Swift中不同类型的超类属性
EN

Stack Overflow用户
提问于 2014-06-07 13:50:38
回答 14查看 71.8K关注 0票数 142

在Swift中,有人能解释一下如何用从原始属性派生的子类的另一个对象覆盖超类的属性吗?

举个简单的例子:

代码语言:javascript
运行
复制
class Chassis {}
class RacingChassis : Chassis {}

class Car {
    let chassis = Chassis()
}
class RaceCar: Car {
    override let chassis = RacingChassis() //Error here
}

这将产生以下错误:

代码语言:javascript
运行
复制
Cannot override with a stored property 'chassis'

如果我将机箱设置为'var‘,我会得到以下错误:

代码语言:javascript
运行
复制
Cannot override mutable property 'chassis' of type 'Chassis' with covariant type 'RacingChassis'

在指南的“覆盖属性”下,我能找到的唯一一件事是,我们必须覆盖getter和setter,这可能适用于更改属性的值(如果它是'var'),但是更改属性类怎么办?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2014-06-07 14:12:45

Swift不允许您更改任何变量或属性的类类型。相反,您可以在处理新类类型的子类中创建一个额外的变量:

代码语言:javascript
运行
复制
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。

票数 124
EN

Stack Overflow用户

发布于 2014-06-12 20:52:14

这似乎行得通

代码语言:javascript
运行
复制
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()
票数 11
EN

Stack Overflow用户

发布于 2017-05-25 17:53:05

试试这个:

代码语言:javascript
运行
复制
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
     } 
}

然后:

代码语言:javascript
运行
复制
let racingChassis = RacingChassis()
let raceCar = RaceCar(chassis:racingChassis)
print(raceCar.description) //output:racing

http://www.mylonly.com/14957025459875.html中的详细信息

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24094158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档