Swift 重写方法和属性

在本教程中,我们将通过实例了解 Swift中 的属性和方法重写。

Swift 继承 中,子类继承超类的方法和属性。在 Swift 中支持子类直接访问超类成员。

现在,如果在超类和子类中都定义了相同的方法,那么子类的方法将覆盖超类的方法。这称为重写。

我们使用 override 关键字声明方法重写。例如,

  1. class Vehicle {
  2. func displayInfo(){
  3. ...
  4. }
  5. }
  6. class Car: Vehicle {
  7. // override method
  8. override func displayInfo() {
  9. ...
  10. }
  11. }

这里,Car 子类的 displayInfo() 方法覆盖了 Vehicle 超类的相同方法。

实例:方法重写
  1. class Vehicle {
  2. // method in the superclass
  3. func displayInfo() {
  4. print("Four Wheeler or Two Wheeler")
  5. }
  6. }
  7. // Car inherits Vehicle
  8. class Car: Vehicle {
  9. // overriding the displayInfo() method
  10. override func displayInfo() {
  11. print("Four Wheeler")
  12. }
  13. }
  14. // create an object of the subclass
  15. var car1 = Car()
  16. // call the displayInfo() method
  17. car1.displayInfo()

结果为:

  1. Four Wheeler

在上面的例子中,我们在子类 Car 中覆盖了超类 VehicledisplayInfo() 方法。

  1. // inside the Car class
  2. override func displayInfo() {
  3. print("Four Wheeler")
  4. }

这里,我们使用 override 关键字来指定重写方法。

现在,当我们使用 Car 的对象 car1 调用 displayInfo() 方法时,

  1. car1.displayInfo()

子类内的方法被调用。

这是因为 Car 子类的 displayInfo() 方法覆盖了 Vehicle 超类的相同方法。


Swift 中访问重写方法

要从子类访问超类的方法,我们使用 super 关键字。例如,

  1. class Vehicle {
  2. // method in the superclass
  3. func displayInfo() {
  4. print("Vehicle: Four Wheeler or Two Wheeler")
  5. }
  6. }
  7. // Car inherits Vehicle
  8. class Car: Vehicle {
  9. // overriding the displayInfo() method
  10. override func displayInfo() {
  11. // access displayInfo() of superclass
  12. super.displayInfo()
  13. print("Car: Four Wheeler")
  14. }
  15. }
  16. // create an object of the subclass
  17. var car1 = Car()
  18. // call the displayInfo() method
  19. car1.displayInfo()

结果如下:

  1. Vehicle: Four Wheeler or Two Wheeler
  2. Car: Four Wheeler

在上面的例子中,Car 子类的 displayInfo() 方法覆盖了 Vehicle 超类的相同方法。

CardisplayInfo() 中,我们使用了,

  1. // call method of superclass
  2. super.displayInfo()

调用 VehicledisplayInfo() 方法。

因此,当我们使用 car1 对象调用 displayInfo() 方法时,

  1. // call the displayInfo() method
  2. car1.displayInfo()

将执行 displayInfo() 方法的重写版本和超类版本。


防止方法重写

在 Swift 中,我们可以防止方法重写。

为了使方法不可重写,我们在超类中声明方法时使用 final 关键字。例如,

  1. class Vehicle {
  2. // prevent overriding
  3. final func displayInfo() {
  4. print("Four Wheeler or Two Wheeler")
  5. }
  6. }
  7. // Car inherits Vehicle
  8. class Car: Vehicle {
  9. // attempt to override
  10. override func displayInfo() {
  11. print("Four Wheeler")
  12. }
  13. }
  14. // create an object of the subclass
  15. var car1 = Car()
  16. // call the displayInfo() method
  17. car1.displayInfo()

在上面的例子中,我们将超类中的 displayInfo() 方法标记为 final

一旦方法声明为 final,我们就不能重写它。所以当我们试图覆盖 final 方法时,

  1. override func displayInfo() {
  2. print("Four Wheeler")
  3. }

将产生错误: error: instance method overrides a ‘final’ instance method


Swift 重写属性

在 Swift 中,我们可以重写 计算属性。例如,

  1. class University {
  2. // computed property
  3. var cost: Int {
  4. return 5000
  5. }
  6. }
  7. class Fee: University {
  8. // override computed property
  9. override var cost: Int {
  10. return 10000
  11. }
  12. }
  13. var amount = Fee()
  14. // access fee property
  15. print("New Fee:", amount.cost)

结果如下:

  1. New Fee: 10000

在上面的例子中,我们在超类 University 中创建了一个计算属性。注意子类 Fee 中的代码,

  1. override var cost: Int {
  2. return 10000
  3. }

我们正在重写计算属性 cost。现在,当我们使用目标金额 Fee 访问 cost 属性时,

  1. // access fee property
  2. amount.cost

子类内的属性被调用。

注意:我们不能覆盖 Swift 中存储的属性。例如,

  1. class A {
  2. // stored property
  3. var num = 0
  4. }
  5. class B: A {
  6. // overriding stored property
  7. override var num = 2 // Error Code
  8. }