15.1 从一个示例开始
为了了解继承性,我们先看这样一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息,于是他定义了类Person
,如下所示:
class Person {
var name : String
var age : Int
func description() -> String {
return "\(name) 年龄是: \(age)"
}
init () {
name = ""
age = 1
}
}
一周以后,小赵又遇到了新的需求,需要描述和处理学生信息,于是他又定义了一个新的类Student
,如下所示:
class Student {
var name : String
var age : Int
var school : String
func description() -> String {
return "\(name) 年龄是: \(age)"
}
init() {
school = ""
name = ""
age = 8
}
}
很多人会认为小赵的做法能够理解并相信这是可行的,但是问题在于Student
和Person
两个类的结构太接近了,后者只比前者多了一个属性school
,却要重复定义其他所有的内容,实在让人“不甘心”。Swift提供了解决类似问题的机制,那就是类的继承,代码如下所示:
class Student : Person {
var school : String
override init() {
school = ""
super.init()
age = 8
}
}
Student
类继承了Person
类中的所有特征,“:
”之后的Person
类是父类。Swift中的类可以没有父类,例如Person
类,定义的时候后面没有“:
”,这种没有父类的就是基类。Swift中的继承与在Objective-C等面向对象的语言不同,在Objective-C中,所有类的基类都是NSObject
,在Swift中没有规定这样的一个类。此外override init()
是子类重写父类构造器。
提示 Swift中也没有像Objective-C等面向对象的语言有访问限定符,如
private
(私有的)、public
(公有的)和protected
(保护的)。由于没有公有、私有和保护之分,父类的所有特征(方法、属性、下标)都可以被子类继承。
一般情况下,一个子类只能继承一个父类,这称为单继承,但有的情况下一个子类可以有多个不同的父类,这称为多重继承。在Swift中,类的继承只能是单继承。多重继承可以通过协议实现。也就是说,在Swift中,一个类只能继承一个父类,但是可以遵守多个协议。