寒城攻略:Listo 教你 25 天学会 Swift 语言 - 15 Inheritance

时间:2021-09-30 19:36:01

import Foundation


//***********************************************************************************************

//1.Inheritance(继承)

//_______________________________________________________________________________________________

//介绍

//一个类可以继承另一个类的方法,属性和其他特性。当一个类继承其他类的时候,继承类叫做子类,被继承的类叫做父类,在 Swift 中,继承是区分 与其他类型的一个基本特征

//继承中子类可以调用和访问父类的方法,属性和附属脚本,并且可以重写方法

//可以为类中继承的属性添加属性观察器,这样一来,当属性值进行改变时,类就会被通知到


//***********************************************************************************************

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

//_______________________________________________________________________________________________

//代码演示定义类

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

class Vehicle{

    var numberOfWheels: Int

    var maxPassengers: Int

    func description() -> String{

        return "\(numberOfWheels) wheels; up to \(maxPassengers) passengers"

    }

    init(){                 //定义构造器设置属性的值

        numberOfWheels = 0

        maxPassengers = 1

    }

}

let someVehicle = Vehicle()        //创建类的实例

println(someVehicle.maxPassengers)          //通过类实例访问属性

println(someVehicle.description())          //通过类实例访问方法


//***********************************************************************************************

//3.Subclassing(子类生成)

//_______________________________________________________________________________________________

//创建子类代码实例

class Bicycle: Vehicle{           //定义 Vehicle 的子类 Bicycle,子类可以访问父类的属性和方法

    init(){

        super.init()              //继承父类的构造器

        numberOfWheels = 2        //定义自己的特性

    }

}

let bicycle = Bicycle()

println(bicycle.description())      //继承来自父类的方法以及自身属性的修改


//***********************************************************************************************

//4.Overriding(重写)

//_______________________________________________________________________________________________

//介绍

//子类可以为继承来的实例方法,类方法,实例属性,附属脚本提供自己的实现,这就是重写


//_______________________________________________________________________________________________

//实例代码演示使用 override 重写父类方法

class Car: Vehicle{

    var speed: Double = 0.0

    init(){

        super.init()

        maxPassengers = 5

        numberOfWheels = 4

    }

    override func description() -> String {         //重写父类的方法

        return super.description() + "end!" + "traveling at \(speed) mph"

    }

}

let car = Car()

println(car.description())


//_______________________________________________________________________________________________

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

//代码演示重写父类的 getter setter 属性

class SpeedLimitedCar: Car{

    override var speed: Double{

    get{

        return super.speed

    }

    set{

        super.speed = min(newValue, 40.0)       //当我们设置一个类实例的时候,min 函数根据设置的速度与这里的 set 的速度进行对比取小

    }

    }

}

let limitedCar = SpeedLimitedCar()

limitedCar.speed = 60

println(limitedCar.description())


//_______________________________________________________________________________________________

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

//实例代码演示重写属性观察器

class AutomaticCar: Car{

    var gear = 1

    override var speed: Double{

    didSet{                         //重写属性观察器

        gear = Int(speed / 10.0) + 1

    }

    }

    override func description() -> String {

        return super.description() + "in gear \(gear)"

    }

}

let automatic = AutomaticCar()

automatic.speed = 35.0

println(automatic.description())


//***********************************************************************************************

//5.Preventing Overrides(防止重写)

//_______________________________________________________________________________________________

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