Skip to content

Swift 入门(17):继承与多态

Swift 是面向对象语言,支持 继承多态,但比起某些语言更强调组合。

1. 基本继承

swift
class Animal {
  var name: String
  init(name: String) {
    self.name = name
  }
  func makeSound() {
      print("...")
  }
}

class Dog: Animal {
  func fetch() {
    print("\(name) is fetching!")
  }

  // 重写父类方法
  override func makeSound() {
    print("Woof!")
  }
}

let dog = Dog(name: "Buddy")
dog.makeSound()   // Woof!
dog.fetch()       // Buddy is fetching!

2. 多态

父类引用可以指向子类对象:

swift
let a: Animal = Dog(name: "Max")
a.makeSound()   // 调用的是 Dog 的实现 -> "Woof!"

这就是 多态:相同的接口,表现不同的行为。

3. final 关键字

如果不希望类被继承,可以用 final

swift
final class Cat: Animal {
  override func makeSound() {
      print("Meow!")
  }
}

// ❌ 下面代码会报错:不能继承 final 类
// class Kitten: Cat {}

4. 构造器的继承与重写

子类如果没有写构造器,会自动继承父类的构造器。

swift
class Bird: Animal {
  override func makeSound() {
      print("Chirp!")
  }
}

let b = Bird(name: "Tweety") // ✅ 直接用父类 init

如果写了自己的 init,可能需要 super.init

swift
class Parrot: Animal {
  var color: String
  init(name: String, color: String) {
    self.color = color
    super.init(name: name) // 必须调用父类构造器
  }
}

5. 多态与协议的对比

  • 继承:类与类之间的关系,强调 "is-a"。
  • 协议:行为的抽象,强调 "can-do"。
  • 在 Swift 开发中,协议比继承更常用。

总结

  • 继承允许子类扩展和重写父类功能。
  • 多态通过父类引用调用子类实现。
  • 使用 final 可以禁止继承。
  • Swift 提倡 少用继承,多用协议与组合

本站总访问