十二、继承 Inheritance

1. 概述

子类可以访问父类的方法,属性和下标脚本。并且可以覆盖父类的版本,实现自己的版本。

同样, 也可以在子类中给父类的属性(stored or computed)提供属性监视器。

 

2. 定义一个基类 Defining a Base Class

不是从任何类继承而来的来,称为基类。

如下,定义一个汽车的基类:

    class Vehicle {
      var currentSpeed = 0.0
      var description: String {//只读属性
        return "traveling at \(currentSpeed) miles per hour"
      }
      func makeNoise() {
        // do nothing - an arbitrary vehicle doesn't necessarily make a noise
      }
    }

 

3. 子类 Subclassing

定义一个自行车类

    class Bicycle: Vehicle {
        var hasBasket = false
    }

 

4. 重载(覆盖) Overriding

使用override关键字在子类中覆盖父类的版本

 

5. 访问父类的方法、属性和下标脚本 Accessing Superclass Methods, Properties, and Subscripts

子类定义了自己的版本,覆盖父类的版本时,有时需要访问父类的版本,此时使用super关键字访问父类版本,如:

super.someMethod()

super.someProperty

super[someIndex]

 

6. 覆盖方法 Overriding Methods

如,定义火车类:

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

 

7. 覆盖属性 Overriding Properties

7.1 覆盖get方法和set方法 Overriding Property Getters and Setters

你可以在子类中给父类的任何属性提供get方法和set方法。

在父类中为 read-only 属性,在子类中你可以给它同时提供 get 和 set 方法,使它在子类中为 read-write 属性。

反之不行,你不能将父类中 read-write 属性,在子类中覆盖为 read-only 。

如,car 类:

    class Car: Vehicle {
      var gear = 1
      override var description: String {
        return super.description + " in gear \(gear)"
      }
    }
    let car = Car()
    car.currentSpeed = 25.0
    car.gear = 3
    println("Car: \(car.description)")
    // Car: traveling at 25.0 miles per hour in gear 3

 

7.2 覆盖属性监视器 Overriding Property Observers

你可以给任何继承来的属性添加属性监视器,除开以下情况:

1)你不能在子类中给 inherited constant stored properties 和 inherited read-only computed properties 添加属性监视器,因为他们不可改变。

2)你不能在子类中同时提供覆盖的set 方法和覆盖的属性监视器,因为你可以在set方法中对属性值的变化作出反应。

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

 

8. 阻止覆盖Preventing Overrides

你可以通过final关键字让某个类中属性、方法和小标脚本无法被子类覆盖,如

final var

final func

final class func

final subscript

final class //这个类不能被任何类继承

 

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

 

posted @ 2015-01-19 11:05  action爱生活  阅读(203)  评论(0编辑  收藏  举报