假设您有一个名为 Vehicle
的类:
class Vehicle {
var name: String
var size: Int
init(name: String, size: Int) {
self.name = name
self.size = size
}
convenience init(name: String) {
self.init(name: name, size: 100)
}
func operate() {
print("operate")
}
}
如果我有一个名为 Car
的子类并创建一个便利的初始值设定项:
class Car: Vehicle {
convenience init(size: Int) {
self.init(name: "Vehicle", size: size)
}
}
使用self
可以使用父类(super class)的初始值设定项。
但是,如果我想重写父类(super class)的方法,可以使用 super
来实现:
class Car: Vehicle {
// redacted
override func operate() {
super.operate()
print("operate a car")
}
}
如果子类想要使用继承的方法,可以通过使用self
来实现:
class Car: Vehicle {
// redacted
func drive() {
self.operate()
print("drive")
}
}
我知道类方法是实例方法,这意味着 self 指的是类的实例。我猜当子类继承父类(super class)的方法时,它就成为它自己的实例方法。为什么它不适用于覆盖?我对 self
和 super
的用法感到困惑。
最佳答案
Why does it not apply to overriding?
那么,在这段代码中:
class Car: Vehicle {
// redacted
override func operate() {
super.operate()
print("operate a car")
}
}
self.operate
将引用 Car
中的重写方法。换句话说,如果您调用 self.operate(),它将创建无限递归。另一方面,super.operate
指的是:
func operate() {
print("operate")
}
这样想:当你重写一个方法时,你就“丢失”了你继承的方法的版本,你只能使用 super
来访问 super 中的原始方法类。
此外,没有人会阻止你做:
class Car: Vehicle {
func drive() {
super.operate()
print("drive")
}
}
只是在这种情况下,super.operate()
和 this.operate()
做了完全相同的事情,因为 operate
不会在子类中被重写。
另一方面,在便捷初始化程序中调用 super.init
是非法的。您必须在便利初始化器中委托(delegate)给 self.init
。在这种情况下,父类(super class)初始化器是继承的,因为您没有任何指定的初始化器(通常,它们不是继承的!)。了解有关初始化器的更多信息 here .
关于ios - 子类中 self 和 super 之间的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64419645/