Swift2.1 语法指南——继承

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID193

1、继承

在Swift中,继承是类和其他类型区分开的基本行为。

在 Swift 中,类可以调用和访问超类的方法,属性和下标(subscripts),并且可以重写这些方法,属性和下标脚本来优化或修改它们的行为。Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写行为是正确的。

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

2、定义基类

没有继承任何类的类,称为基类。

注意:Swift中任何类都没有继承一个通用的类(如Objective-C中的NSObject),所以定义类时只要没有指定超类,该类就自动称为基类。

下面是一个基类Vehicle:

1 class Vehicle {
2     var currentSpeed = 0.0
3     var description: String {
4         return "traveling at \(currentSpeed) miles per hour"
5     }
6     func makeNoise() {
7         // do nothing - an arbitrary vehicle doesn‘t necessarily make a noise
8     }
9 }

可以创建它的一个实例:

1 let someVehicle = Vehicle()

访问它的description属性:

1 print("Vehicle: \(someVehicle.description)")
2 // Vehicle: traveling at 0.0 miles per hour

3、子类化

子类化,也就是在一个已存在的类的基础上新建一个类。子类继承超父类的特性,然后你可以重新定义,也可以定义新的特性。

1 class SomeSubclass: SomeSuperclass {
2     // subclass definition goes here
3 }

下面,新建Vehicle的子类:

1 class Bicycle: Vehicle {
2     var hasBasket = false
3 }

Bicycle自动获得Vehicle的所有特性,包括currentSpeed和description属性、makeMoise()方法。

此外,Bicycle添加了一个新的默认值为false的属性hasBasket。

创建一个Bicycle的实例:

1 let bicycle = Bicycle()
2 bicycle.hasBasket = true

可以修改它从父类继承下来的属性:

1 bicycle.currentSpeed = 15.0
2 print("Bicycle: \(bicycle.description)")
3 // Bicycle: traveling at 15.0 miles per hour

子类还可以被子类化:

1 class Tandem: Bicycle {
2     var currentNumberOfPassengers = 0
3 }

创建一个Tandem的实例:

1 let tandem = Tandem()
2 tandem.hasBasket = true
3 tandem.currentNumberOfPassengers = 2
4 tandem.currentSpeed = 22.0
5 print("Tandem: \(tandem.description)")
6 // Tandem: traveling at 22.0 miles per hour

4、重写

子类可以提供实例方法、类型方法、实例属性、类型属性、下标的自定义实现,否则,将从超类继承。这就是重写的概念。

如果要重写某个特性,你需要在重写定义的前面加上override关键字。这么做,你就表明了你是想提供一个重写版本,而非错误地提供了一个相同的定义。意外的重写行为可能会导致不可预知的错误,任何缺少override关键字的重写都会在编译时被诊断为错误。

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

5、访问超类的方法、属性和下标

当你在子类中重写父类的方法,属性或下标脚本时,有时在你的重写版本中使用已经存在的父类实现会大有裨益。比如,你可以优化已有实现的行为,或在一个继承来的变量中存储一个修改过的值。

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

  • 在方法someMethod的重写实现中,可以通过super.someMethod()来调用超类版本的someMethod方法。
  • 在属性someProperty的 getter 或 setter 的重写实现中,可以通过super.someProperty来访问超类版本的someProperty属性。
  • 在subscript的重写实现中,可以通过super[someIndex]来访问超类版本中的相同下标脚本。

6、重写方法

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

1 class Train: Vehicle {
2     override func makeNoise() {
3         print("Choo Choo")
4     }
5 }

调用重写的方法:

1 let train = Train()
2 train.makeNoise()
3 // prints "Choo Choo"

7、重写属性

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

(1)重写属性的getter和setter

你可以提供定制的 getter(或 setter)来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的属性。子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性会有一个名字和类型。你在重写一个属性时,必需将它的名字和类型都写出来。这样才能使编译器去检查你重写的属性是与超类中同名同类型的属性相匹配的。

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

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

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

当你设置AutomaticCarcurrentSpeed属性,属性的didSet观察器就会自动地设置gear属性,为新的速度选择一个合适的挡位。具体来说就是,属性观察器将新的速度值除以10,然后向下取得最接近的整数值,最后加1来得到档位gear的值。例如,速度为10.0时,挡位为1;速度为35.0时,挡位为4:

1 let automatic = AutomaticCar()
2 automatic.currentSpeed = 35.0
3 print("AutomaticCar: \(automatic.description)")
4 // AutomaticCar: traveling at 35.0 miles per hour in gear 4

8、防止重写

你可以通过把方法,属性或下标脚本标记为final来防止它们被重写,只需要在声明关键字前加上final特性即可。(例如:final varfinal funcfinal class func, 以及 final subscript

如果你重写了final方法,属性或下标,在编译时会报错。在类扩展中的方法,属性或下标脚本也可以在扩展的定义里标记为 final。

你可以通过在关键字class前添加final特性(final class)来将整个类标记为 final 的,这样的类是不可被继承的,任何子类试图继承此类时,在编译时会报错。

时间: 2024-11-09 05:58:17

Swift2.1 语法指南——继承的相关文章

Swift2.1 语法指南——协议

原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID267 参考:http://wiki.jikexueyuan.com/project/swift/chapter2/22_Protocols.html 1.协议 协议定

Swift2.1 语法指南——属性

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254 1.属性 属性将值跟特定的类.结构或枚举关联.存储属性存储变量或常量的值,作为实例的一部分,而计算属性则计算一个值.计算属性用于类.结构体和枚举.而存储属性只用

Swift2.1 语法指南——访问控制

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3 参考:http://wiki.jikexueyuan.com/project/swift/chapter2/24_Access_Control.html 1.

Swift2.1 语法指南——泛型

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html#//apple_ref/doc/uid/TP40014097-CH26-ID179 参考:http://wiki.jikexueyuan.com/project/swift/chapter2/23_Generics.html 1.泛型 泛型代码可以

Swift2.1 语法指南——函数

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID158 函数是完成指定任务的独立代码块. Swift中的函数都有对应的类型,由参数类型和返回值类型共同组成.你可以向使用其他类型一样来使用函数类型,因此,可以将函数作为函

Swift2.1 语法指南——闭包

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94 1.闭包(Closures) 闭包是独立的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C语言和Objective-C语言中的block.其他语言中的la

Swift2.1 语法指南——析构过程

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html#//apple_ref/doc/uid/TP40014097-CH19-ID142 1.析构过程 当类的实例被释放时,析构器被调用.析构器用关键字deinit来标示,类似于构造器要用init来标示.析构器只适用于class类型. (

Swift2.1 语法指南——枚举

原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID145 枚举定义了一个普通类型的一组相关值,使你可以在代码中以一种安全的方式来使用这些值. 如果你熟悉 C 语言,你就会知道,在 C 语言中枚举将枚举名和一个整型

Swift2.1 语法指南——基础

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309 一.常量与变量 1.声明 1 let maximumNumberOfLoginAttempts = 10 2 var currentLoginAttempt = 0