Appearance
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 提倡 少用继承,多用协议与组合。