继承 #

一、继承概述 #

继承是面向对象编程的核心概念,允许一个类继承另一个类的特性。

1.1 继承特点 #

  • 子类继承父类的属性和方法
  • 子类可以添加新特性
  • 子类可以重写父类特性
  • Swift不支持多重继承

二、基本继承 #

2.1 定义子类 #

swift
class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func speak() {
        print("\(name)发出声音")
    }
}

class Dog: Animal {
    var breed: String
    
    init(name: String, breed: String) {
        self.breed = breed
        super.init(name: name)
    }
    
    func fetch() {
        print("\(name)捡球")
    }
}

let dog = Dog(name: "旺财", breed: "金毛")
dog.speak()
dog.fetch()

2.2 继承链 #

swift
class Animal {
    func breathe() {
        print("呼吸")
    }
}

class Mammal: Animal {
    func nurse() {
        print("哺乳")
    }
}

class Dog: Mammal {
    func bark() {
        print("汪汪")
    }
}

let dog = Dog()
dog.breathe()
dog.nurse()
dog.bark()

三、方法重写 #

3.1 override关键字 #

swift
class Animal {
    func speak() {
        print("发出声音")
    }
}

class Dog: Animal {
    override func speak() {
        print("汪汪")
    }
}

class Cat: Animal {
    override func speak() {
        print("喵喵")
    }
}

let dog = Dog()
dog.speak()

let cat = Cat()
cat.speak()

3.2 调用父类方法 #

swift
class Animal {
    func speak() {
        print("发出声音")
    }
}

class Dog: Animal {
    override func speak() {
        super.speak()
        print("汪汪")
    }
}

let dog = Dog()
dog.speak()

四、属性重写 #

4.1 重写存储属性为计算属性 #

swift
class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    override var name: String {
        get {
            return super.name
        }
        set {
            super.name = "狗狗: \(newValue)"
        }
    }
}

let dog = Dog(name: "旺财")
print(dog.name)

4.2 重写属性观察器 #

swift
class Animal {
    var age: Int = 0 {
        willSet {
            print("年龄将变为\(newValue)")
        }
    }
}

class Dog: Animal {
    override var age: Int {
        willSet {
            print("狗狗年龄将变为\(newValue)")
        }
        didSet {
            print("狗狗年龄从\(oldValue)变为\(age)")
        }
    }
}

let dog = Dog()
dog.age = 5

五、final关键字 #

5.1 防止重写 #

swift
class Animal {
    final func breathe() {
        print("呼吸")
    }
}

class Dog: Animal {
    override func breathe() {
        print("不能重写")
    }
}

5.2 防止继承 #

swift
final class FinalClass {
    var value: Int = 0
}

class SubClass: FinalClass {
}

六、初始化器继承 #

6.1 自动继承 #

swift
class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    var breed: String = "Unknown"
}

let dog = Dog(name: "旺财")
print(dog.name)
print(dog.breed)

6.2 重写初始化器 #

swift
class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    var breed: String
    
    init(name: String, breed: String) {
        self.breed = breed
        super.init(name: name)
    }
    
    convenience override init(name: String) {
        self.init(name: name, breed: "Unknown")
    }
}

let dog1 = Dog(name: "旺财")
let dog2 = Dog(name: "小黑", breed: "拉布拉多")

6.3 必要初始化器 #

swift
class Animal {
    var name: String
    
    required init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    var breed: String
    
    required init(name: String) {
        self.breed = "Unknown"
        super.init(name: name)
    }
}

七、类型检查与转换 #

7.1 is运算符 #

swift
class Animal {}
class Dog: Animal {}
class Cat: Animal {}

let animals: [Animal] = [Dog(), Cat(), Dog()]

var dogCount = 0
var catCount = 0

for animal in animals {
    if animal is Dog {
        dogCount += 1
    } else if animal is Cat {
        catCount += 1
    }
}

print("狗: \(dogCount), 猫: \(catCount)")

7.2 as运算符 #

swift
let animals: [Animal] = [Dog(), Cat()]

for animal in animals {
    if let dog = animal as? Dog {
        print("这是一只狗")
    } else if let cat = animal as? Cat {
        print("这是一只猫")
    }
}

7.3 Any和AnyObject #

swift
let things: [Any] = [1, "Hello", 3.14, Dog()]

for thing in things {
    switch thing {
    case let intValue as Int:
        print("整数: \(intValue)")
    case let stringValue as String:
        print("字符串: \(stringValue)")
    case let doubleValue as Double:
        print("浮点数: \(doubleValue)")
    case let dog as Dog:
        print("狗")
    default:
        print("未知类型")
    }
}

八、实际应用 #

8.1 模板方法模式 #

swift
class Game {
    func play() {
        initialize()
        startPlay()
        endPlay()
    }
    
    func initialize() {
        print("游戏初始化")
    }
    
    func startPlay() {
        fatalError("子类必须实现")
    }
    
    func endPlay() {
        print("游戏结束")
    }
}

class Football: Game {
    override func startPlay() {
        print("踢足球")
    }
}

class Basketball: Game {
    override func startPlay() {
        print("打篮球")
    }
}

8.2 抽象基类 #

swift
class Shape {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func area() -> Double {
        fatalError("子类必须实现")
    }
    
    func perimeter() -> Double {
        fatalError("子类必须实现")
    }
}

class Rectangle: Shape {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
        super.init(name: "矩形")
    }
    
    override func area() -> Double {
        return width * height
    }
    
    override func perimeter() -> Double {
        return 2 * (width + height)
    }
}

九、总结 #

本章学习了Swift继承:

  • 继承语法:class SubClass: SuperClass
  • 方法重写:override关键字
  • 属性重写:重写属性和观察器
  • final:防止重写和继承

最佳实践:

  • 合理使用继承层次
  • 使用final防止不必要的重写
  • 使用协议替代多重继承
  • 注意初始化器继承规则

下一章,我们将学习协议!

最后更新:2026-03-26