跳转至

继承

继承

目录


1.继承

定义一个基类Vehicle

class Vehicle{
    //存储属性
    var currentSpeed = 0.0
    //计算属性
    var description:String{
        return "traveling at \(currentSpeed) miles per hour"
    }

    func makeNoise(){
        // nothing
    }
}

定义一个Bicycle类,继承Vehicle。

// 自行车
class Bicycle:Vehicle{
    var hasBascket = false
}

var bicycle = Bicycle()

bicycle.hasBascket = true

bicycle.currentSpeed = 15.0

println(bicycle.description)
// 输出 traveling at 15.0 miles per hour

2.重写

子类可以为继承来的实例方法,类方法,实例属性,或下标脚本,提供自己定制的实现。我们把这种行为叫重写。

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

2.1重写方法

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

定义Vehicle的一个子类Train,它重写了从Vehicle类继承来的makeNoise方法

//重写方法

class Train:Vehicle{
    override func makeNoise() {
        println("Choo Choo")
    }
}

let train = Train()

train.makeNoise()
// 打印Choo Choo

2.2重写属性

2.2.1重写属性的Getters和Setters

你可以提供定制的 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)"
    }
}

// 属性观察器

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
2.2.2重写属性观察器

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

// 重写属性观察器
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

2.3防止重写

你可以通过把方法,属性或下标脚本标记为final来防止它们被重写。(例如:final var, final func, final class func, 以及 final subscript)

评论