Swift 继承学习笔记

什么是继承?

继承是面向对象编程中的一个概念,它允许创建一个新的类,这个新的类可以继承一个或多个已有的类的特性,从而不需要重新编写已经存在的代码。

在 Swift 中,我们使用 class 关键字来定义一个类,并使用 : 来指明当前类所继承的父类。

如何定义一个子类?

我们可以使用下面的语法来定义一个子类:

swiftCopy Code
class 子类名称: 父类名称 { // 子类的属性和方法 }

例如,下面的代码定义了一个名为 Animal 的父类,以及两个子类 CatDog,它们继承自父类 Animal

swiftCopy Code
class Animal { let name: String let age: Int init(name: String, age: Int) { self.name = name self.age = age } func eat() { print("\(name) is eating.") } } class Cat: Animal { override func eat() { print("\(name) is eating fish.") } } class Dog: Animal { override func eat() { print("\(name) is eating meat.") } }

可以看到,子类 CatDog 继承了父类 Animal 中的属性 nameage,并且它们都重写了父类中的方法 eat()

如何调用父类的初始化方法?

在子类的初始化方法中,我们可以使用 super 来调用父类的初始化方法。例如,在下面的代码中,子类 ColorfulCircle 继承了父类 Circle,并且子类中定义了一个新的属性 color

swiftCopy Code
class Circle { let radius: Double init(radius: Double) { self.radius = radius } } class ColorfulCircle: Circle { let color: String init(radius: Double, color: String) { self.color = color super.init(radius: radius) } }

从上述代码可以看到,子类 ColorfulCircle 的初始化方法中首先要初始化它自己的属性 color,然后再调用父类 Circle 的初始化方法,即 super.init(radius: radius)

如何重写父类的方法?

在子类中,我们可以通过重写父类的方法来实现自己的功能。在 Swift 中,如果要重写父类的方法,需要在子类中使用 override 关键字。例如,在下面的代码中,子类 CatDog 重写了父类 Animal 中的方法 eat()

swiftCopy Code
class Animal { let name: String init(name: String) { self.name = name } func eat() { print("\(name) is eating.") } } class Cat: Animal { override func eat() { print("\(name) is eating fish.") } } class Dog: Animal { override func eat() { print("\(name) is eating meat.") } }

实例

下面是一个使用继承的实例,其中 Vehicle 是一个父类,它代表了所有交通工具的共同属性和方法。子类 CarBicycle 分别继承了父类 Vehicle 的属性和方法,并且它们也分别定义了自己特有的属性和方法:

swiftCopy Code
class Vehicle { let name: String let speed: Double init(name: String, speed: Double) { self.name = name self.speed = speed } func run() { print("\(name) is running at \(speed) km/h.") } } class Car: Vehicle { let seats: Int init(name: String, speed: Double, seats: Int) { self.seats = seats super.init(name: name, speed: speed) } func horn() { print("\(name) is honking.") } } class Bicycle: Vehicle { let hasBasket: Bool init(name: String, speed: Double, hasBasket: Bool) { self.hasBasket = hasBasket super.init(name: name, speed: speed) } func ringBell() { print("\(name) is ringing the bell.") } }

现在我们可以创建一个 Car 对象和一个 Bicycle 对象,并调用它们的方法:

swiftCopy Code
let car = Car(name: "BMW", speed: 200, seats: 5) car.run() // BMW is running at 200.0 km/h. car.horn() // BMW is honking. let bicycle = Bicycle(name: "Giant", speed: 30, hasBasket: true) bicycle.run() // Giant is running at 30. [Something went wrong, please try again later.]