gpt4 book ai didi

swift - swift 中的重写是否会替换或修改父类(super class)的属性和方法的当前实现? swift

转载 作者:行者123 更新时间:2023-11-30 12:19:22 26 4
gpt4 key购买 nike

Swift 中的重写是否会替换或修改父类(super class)的属性和方法的当前实现?在对代码进行实验后,我发现 swift 中的重写方法不会修改父类(super class)中的现有方法。我假设它类似于java中的动态绑定(bind)。另一方面,覆盖存储属性的计算属性似乎会修改父类(super class)的属性。从下面的代码中您可以看到,即使调用了 super,也会打印新值 87 而不是 0.0,而调用方法时情况并非如此。我想确认我的观察是否属实,或者这背后是否还有其他原因。

class Vehicle {
var currentSpeed: Double = 0.0
var cuc: Double = 0.0


var description: String {
return "traveling at \(currentSpeed) miles per hour"
}

func makeNoise() {
// do nothing - an arbitrary vehicle doesn't necessarily
// make a noise
}
}

class Car: Vehicle {
var gear = 1
override var currentSpeed: Double {
didSet {
print(super.currentSpeed)
}
}
//override var currentSpeed: Double = 56
override var description: String {
return super.description + " in gear \(gear)"
}
}
var car = Car()
car.currentSpeed = 87
print(car.description)

另一段代码执行相反的操作并生成 0 而不是 90 。

override var currentSpeed: Double {
set {
super.cuc = 90
}
get {
return super.cuc
}
}
print(car.cuc)

最佳答案

事实并非如此。考虑一下该陈述何时为真。我不明白为什么它应该像你所描述的那样工作。你举了变量中的坏例子。例如取函数。 (参见 move() 函数)

class Vehicle {
var currentSpeed: Double = 0.0

var description: String {
return "traveling at \(currentSpeed) miles per hour"
}

func move() {

// Move, every vehicle should really move...

}
}

class Car: Vehicle {
var gear = 1
override var currentSpeed: Double {
didSet {
print(super.currentSpeed)
}
}

override func move(){
//Call super.move to call method from superclass for moving (default implemented behavior)
super.move()
//Car should make noise or start spinning wheels (lol funny example)
startSpinningWheels()
makeNoise()
}


private func makeNoise(){
//Make noise...

}

private func startSpinningWheels(){
//Start spinning wheels on vehicle...
}

//override var currentSpeed: Double = 56
override var description: String {
return super.description + " in gear \(gear)"
}
}

现在好了。如果 move() 方法会修改父类(super class)的行为,那不会很奇怪吗?因为你知道,例如 Plane 需要启动旋转轮子,这非常明显 :D 所以答案是否定的,这将根本无法继承。您应该阅读有关继承的整个想法...

问题是您可以将当前对象实例转换为父类(super class)对象(将 Car 设置为?车辆)并仅修改 Car 对象中未声明的属性...

让 myCar = Car()

//这里没有错误让 carAsVehicle = myCar 作为车辆

//这里都不是。打印(carAsVehicle.currentSpeed)

请参阅 Apple 文档中的继承: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html

祝您编码愉快,如果您有任何问题,请随时提问!

关于swift - swift 中的重写是否会替换或修改父类(super class)的属性和方法的当前实现? swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com