15.1 从一个示例开始

为了了解继承性,我们先看这样一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息,于是他定义了类Person,如下所示:

  1. class Person {
  2. var name : String
  3. var age : Int
  4. func description() -> String {
  5. return "\(name) 年龄是: \(age)"
  6. }
  7. init () {
  8. name = ""
  9. age = 1
  10. }
  11. }

一周以后,小赵又遇到了新的需求,需要描述和处理学生信息,于是他又定义了一个新的类Student,如下所示:

  1. class Student {
  2. var name : String
  3. var age : Int
  4. var school : String
  5. func description() -> String {
  6. return "\(name) 年龄是: \(age)"
  7. }
  8. init() {
  9. school = ""
  10. name = ""
  11. age = 8
  12. }
  13. }

很多人会认为小赵的做法能够理解并相信这是可行的,但是问题在于StudentPerson两个类的结构太接近了,后者只比前者多了一个属性school,却要重复定义其他所有的内容,实在让人“不甘心”。Swift提供了解决类似问题的机制,那就是类的继承,代码如下所示:

  1. class Student : Person {
  2. var school : String
  3. override init() {
  4. school = ""
  5. super.init()
  6. age = 8
  7. }
  8. }

Student类继承了Person类中的所有特征,“:”之后的Person类是父类。Swift中的类可以没有父类,例如Person类,定义的时候后面没有“:”,这种没有父类的就是基类。Swift中的继承与在Objective-C等面向对象的语言不同,在Objective-C中,所有类的基类都是NSObject,在Swift中没有规定这样的一个类。此外override init()是子类重写父类构造器。

提示 Swift中也没有像Objective-C等面向对象的语言有访问限定符,如private(私有的)、public(公有的)和protected(保护的)。由于没有公有、私有和保护之分,父类的所有特征(方法、属性、下标)都可以被子类继承。

一般情况下,一个子类只能继承一个父类,这称为单继承,但有的情况下一个子类可以有多个不同的父类,这称为多重继承。在Swift中,类的继承只能是单继承。多重继承可以通过协议实现。也就是说,在Swift中,一个类只能继承一个父类,但是可以遵守多个协议。