Swift_继承

来源:互联网 发布:软件项目管理ppt 编辑:程序博客网 时间:2024/05/16 12:38

/**

 *  继承

 */

//父类(超类)

class Vehicle {

    var currentSpeed = 0.0

    var description:String {

        return "traveling at \(currentSpeed) miles per hour"

    }

    func makeNoise() {

        //什么不做

    }

}


let someVehicle = Vehicle()

print(someVehicle.description)

//子类


class Bicycle: Vehicle {

    var hasBasket = false

}


let bicycle = Bicycle()

bicycle.hasBasket = true


print(bicycle.hasBasket)


bicycle.currentSpeed = 1.5

print(bicycle.description)



class Tandem: Bicycle {

    var currentNumberOfPassengers = 0

}


let tandem = Tandem()

tandem.hasBasket = true

tandem.currentNumberOfPassengers = 2

tandem.currentSpeed = 22.0

print("Tandem: \(tandem.description)")


//重写(Overriding)


class Train: Vehicle {

    override func makeNoise() {

        print("___Choo Choo")

    }

}


let train = Train()

train.makeNoise()


//重写属性

/*

 重写属性的GettersSetters

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

print(car.description)

car.currentSpeed = 25

car.gear = 3

print("Car: \(car.description)")

//重写属性观察器(Property Observer)

/*

 注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。

 这些属性的值是不可以被设置,所以,为它们提供 willSet didSet 实现是不恰当。

 此外还要注意,你不可以同时提供重写的 setter 重写的属性观察器。如果你想观察属性值的变化,

 并且你已经为那个属性提供了定制的 setter,那么你在 sett er 中就可以观察到任何值变化了。

 */


class AutomaticCar: Car {

    override var currentSpeed: Double{

        didSet{

            gear = Int(currentSpeed / 10.0) + 1

        }

    }

}


let automatic = AutomaticCar()

automatic.currentSpeed = 35.0;

print("AutomaticCar :\(automatic.description)")


//防止重写

/*

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

 可。(例如: final var , final func , final class func , 以及 final subscript )

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

 展的定义里标记为 final

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

 */

0 0