Swift学习笔记(十一)继承

来源:互联网 发布:python 网络爬虫 pdf 编辑:程序博客网 时间:2024/04/28 02:02

继承

Swift 中,类可以调用和访问超类的方法,属性和附属脚本(subscripts),并且可以重写(override)这些方法,属性和附属脚本来优化或修改它们的行为

可以为类中继承来的属性添加属性观察器(property observer),这样一来,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(stored property)还是计算型属性(computed property)。

定义一个基类(Base class

注意:Swift 中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。

class Vehicle {    var currentSpeed = 0.0    var description: String {//只读属性,只定义了getter方法        return "traveling at \(currentSpeed) miles per hour"    }    func makeNoise() {        // do nothing - an arbitrary vehicle doesn't necessarily make a noise    }}let someVehicle = Vehicle()println("Vehicle: \(someVehicle.description)")// Vehicle: traveling at 0.0 miles per hour

子类生成(Subclassing

子类生成(Subclassing)指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。

class Bicycle: Vehicle {    var hasBasket = false}let bicycle = Bicycle()bicycle.hasBasket = true//你能够修改继承自Bicycle实例的currentSpeed属性,bicycle.currentSpeed = 15.0println("Bicycle: \(bicycle.description)")// Bicycle: traveling at 15.0 miles per hour

子类还可以继续被其它类继承

class Tandem: Bicycle {    var currentNumberOfPassengers = 0}

Tandem继承了Bicycle类的所有属性和方法,继而从Vehicle继承了所有属性和方法。

Tandem子类添加了一个储值属性currentNumberOfPassengers,并附默认值为0

let tandem = Tandem()tandem.hasBasket = truetandem.currentNumberOfPassengers = 2tandem.currentSpeed = 22.0println("Tandem: \(tandem.description)")// Tandem: traveling at 22.0 miles per hour

重写(Overriding

子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或附属脚本(subscript)提供自己定制的实现(implementation)。

如果要重写某个特性,你需要在重写定义的前面加上override关键字。这么做,你就表明了你是想提供一个重写版本,而非错误地提供了一个相同的定义。

override关键字会提醒 Swift编译器去检查该类的超类(或其中一个父类)是否有匹配重写版本的声明。这个检查可以确保你的重写定义是正确的。

访问超类的属性、方法和附属脚本


在合适的地方,你可以通过使用super前缀来访问超类版本的方法,属性或附属脚本:

>>>在方法someMethod的重写实现中,可以通过super.someMethod()来调用超类版本的someMethod方法。

>>>在属性someProperty getter setter 的重写实现中,可以通过super.someProperty来访问超类版本的someProperty属性。

>>>在附属脚本的重写实现中,可以通过super[someIndex]来访问超类版本中的相同附属脚本。

重写方法

在子类中,你可以重写继承来的实例方法或类方法,提供一个定制或替代的方法实现

class Train: Vehicle {    override func makeNoise() {        println("Choo Choo")    }}let train = Train()train.makeNoise()// prints "Choo Choo"

重写属性: 你可以重写继承来的实例属性或类属性,提供自己定制的gettersetter,或添加属性观察器使重写的属性观察属性值什么时候发生改变。

重写属性的GettersSetters: 你可以提供定制的 getter(或 setter)来重写任意继承来的属性。

重写一个属性时,必须将它的名字和类型都写出来。

注意

:可以将一个继承来的只读属性重写为一个读写属性,只需要你在重写版本的属性里提供 getter setter 即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。

:如果你在重写属性中提供了 setter,那么你也一定要提供 getter。如果你不想在重写版本中的 getter里修改继承来的属性值,你可以直接返回super.someProperty来返回继承来的值。

class Car: Vehicle {    var gear = 1    override var description: String {        //重写父类的只读属性        return super.description + " in gear \(gear)"    }}let car = Car()car.currentSpeed = 25.0car.gear = 3println("Car: \(car.description)")// Car: traveling at 25.0 miles per hour in gear 3

重写属性观察者

你可以在属性重写中为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,你就会被通知到

注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSetdidSet实现是不恰当。此外还要注意,你不可以同时提供重写的 setter和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter中就可以观察到任何值变化了。

class AutomaticCar: Car {    override var currentSpeed: Double {        didSet {            gear = Int(currentSpeed / 10.0) + 1        }    }}let automatic = AutomaticCar()automatic.currentSpeed = 35.0println("AutomaticCar: \(automatic.description)")// AutomaticCar: traveling at 35.0 miles per hour in gear 4

防止重写

你可以通过把方法,属性或附属脚本标记为final来防止它们被重写,只需要在声明关键字前加上@final特性即可。

(例如:@final var, @final func, @final class func,以及 @final subscript

你可以通过在关键字class前添加@final特性(@final class)来将整个类标记为 final的,这样的类是不可被继承的,否则会报编译错误。

0 0
原创粉丝点击