亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 1484 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號