ios - 子类中 self 和 super 之间的混淆

标签 ios swift class oop inheritance

假设您有一个名为 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)的方法时,它就成为它自己的实例方法。为什么它不适用于覆盖?我对 selfsuper 的用法感到困惑。

最佳答案

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/

相关文章:

c++ - 让类(class)与运营商合作的更简单方法?

ios - Apple IAP 收据/状态通知中 cancellation_date 字段的格式是什么

ios - 用于云 Firestore 数据库触发器的 Stripe Connect 重定向 uri

ios - 如何以编程方式在 iOS 中实现即时标记功能

swift - 从非协议(protocol)、非类类型继承 'CGPoint'

arrays - 单击collectionView转到另一个具有不同数组的collectionView

ios - 如何删除 Collection View 单元格之间的空间?

C#:使用包含它的类使字段只能修改

class - 在 Groovy 脚本中包含类

objective-c - 编译器如何确定哪些消息可以发送到 id 类型变量?