继承 #
一、继承概述 #
继承是面向对象编程的核心概念,允许一个类继承另一个类的特性。
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