Swift 继承学习笔记
什么是继承?
继承是面向对象编程中的一个概念,它允许创建一个新的类,这个新的类可以继承一个或多个已有的类的特性,从而不需要重新编写已经存在的代码。
在 Swift 中,我们使用 class
关键字来定义一个类,并使用 :
来指明当前类所继承的父类。
如何定义一个子类?
我们可以使用下面的语法来定义一个子类:
swiftCopy Codeclass 子类名称: 父类名称 {
// 子类的属性和方法
}
例如,下面的代码定义了一个名为 Animal
的父类,以及两个子类 Cat
和 Dog
,它们继承自父类 Animal
:
swiftCopy Codeclass 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.")
}
}
可以看到,子类 Cat
和 Dog
继承了父类 Animal
中的属性 name
和 age
,并且它们都重写了父类中的方法 eat()
。
如何调用父类的初始化方法?
在子类的初始化方法中,我们可以使用 super
来调用父类的初始化方法。例如,在下面的代码中,子类 ColorfulCircle
继承了父类 Circle
,并且子类中定义了一个新的属性 color
:
swiftCopy Codeclass 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
关键字。例如,在下面的代码中,子类 Cat
和 Dog
重写了父类 Animal
中的方法 eat()
:
swiftCopy Codeclass 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
是一个父类,它代表了所有交通工具的共同属性和方法。子类 Car
和 Bicycle
分别继承了父类 Vehicle
的属性和方法,并且它们也分别定义了自己特有的属性和方法:
swiftCopy Codeclass 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 Codelet 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.]