Swift—继承

  一个类可以继承另一个类的方法,属性和其他特性。当一个类继承其他类时,继承类叫子类,被继承类叫超类(或父类)。在Swift中,继承具有单继承的特点,每个子类只有一个直接父类,继承是区分类与其他类型的一个基本特征。

  在Swift中,类可以调用和访问父类的方法,属性和下标脚本,并且可以重写这些方法,属性和下标脚本来优化或修改他们的行为。Swift会检查你的重写定义在父类中是否有匹配的定义,以此确保你的重写行为是正确的。可以为类中继承来的属性添加属性观察器,这样,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原来被定义为存储型属性还是计算型属性。

1.定义一个基类

  不继承于其他类的类,称之为基类。(Swift中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。)

class Fruit {
    var weight = 0.0
    func info() {
        print("我是一个水果,重\(weight)")
    }
}
var f = Fruit()
f.info() //我是一个水果,重0.0

2.子类生成

  子类生成指的是在一个已有类的基础上创建一个新的类。子类继承父类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:

class SomeClass: SomeSuperClass {
    //类的定义
}

  定义一个Apple类,继承Fruit

class Apple: Fruit {
    var name : String!
    func taste() {
        print("\(name) taste good")
    }
}
var a = Apple()
a.weight = 3.2
a.name = "黄香蕉"
a.info() //我是一个水果,重3.2
a.taste() //黄香蕉 taste good

3.重写

  子类可以为继承来的实例方法,类方法,实例属性或下标脚本提供自己的实现,这种行为叫重写。当子类重写父类的方法时,要使用override修饰。

  当子类重写了父类的方法,属性或下标脚本,子类将无法访问父类中被覆盖的内容,此时你可以使用super前缀来访问父类版本的方法,属性和下标脚本。

  3.1重写方法

  Apple类重写了父类的info方法,并调用super.info,打印两次。

class Apple: Fruit {
    var name : String!
    func taste() {
        print("\(name) taste good")
    }
    
    override func info() {
        super.info()
        print("\(name) weight is \(weight)")
    }
}
var a = Apple()
a.weight = 3.2
a.name = "黄香蕉"
a.info() //我是一个水果,重3.2   黄香蕉 weight is 3.2

  3.2重写属性

  Swift允许提供定制的getter(或setter)来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的属性。子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性的名字和类型。因此你在重写一个属性时,必须将它的名字和属性都写出来。可以将一个继承来的只读属性重写为一个读写属性,但不能将一个继承来的读写属性重写为一个只读属性。

class Fruit {
    var weight = 0.0
    var description : String {
        return "\(self.weight)"
    }
}

class Apple: Fruit {
    var name : String!
    override var description: String {
        return self.name + " weight is " + super.description
    }
}
var a = Apple()
a.weight = 4.0
a.name = "黄香蕉"
print(a.description) // 黄香蕉 weight is 4.0

  3.3重写属性观察者

  不要为继承来的常量存储属性或继承来的只读计算型属性添加属性观察者,这些属性的值是不会发生任何改变的。

  不要同时提供重写的setter和重写的属性观察器,如果你想观察属性值的变化,并且已经为那个属性提供了setter方法,那么你在setter中就可以观察到了。

class Fruit {
    var weight = 0.0
}

class Apple: Fruit {
    var name : String!
    override var weight: Double {
        didSet {
            super.weight += 1
        }
    }
}
var a = Apple()
a.weight = 4.0
print(a.weight) //5.0

  3.4重写下标

  重写下标可以提供定制的getter和setter。重写下标时,可以将父类的只读下标改写为读写下标,但不能将父类的读写下标重写为只读下标。

  3.5防止重写

  final修饰符,可修饰类、属性、方法、下标。使用final修饰的类不能被继承,使用final修饰的方法、属性、下标脚本不能被重写。