Swift程序员iOS学习笔记

Swift复习系列:继承

2017-09-18  本文已影响100人  ZYiDa

定义一个基类

不能继承于其它类的类被称为基类,如Objective-C中NSObject就是一个基类。但在Swift中类并不是从一个通用的基类继承而来的,如果你不为定义的类指定一个父类,那么它就会自动成为基类。

请看下面的例子

class Vehicle
{
    var currentSpeed:Double = 0.0
    var description:String
    {
        return "Traveling at \(currentSpeed) miles per hour."
    }

    func makeNoise()
    {
        //在这里什么都不做
    }
}

如上,我们定义了一个基类Vehicle(交通工具),它包含一个存储型属性currentSpeed和一个只读的计算型属性description,同时还有一个方法makeNoise().

生成一个子类(子类生成)

子类生成指:在已有类的基础上生成一个新的类,该子类具有父类的特性,并且可以进一步完善和新的特性。
语法:

class name : super class
{
    code
}

请看下面的例子:

//子类
class Bicycle: Vehicle
{
    var hasBasket:Bool = false
}

let bicycle = Bicycle.init()
bicycle.hasBasket = true
bicycle.currentSpeed = 88.88
print("\(bicycle.description)")
bicycle.makeNoise()

输出结果

The bicycle does have basket.
Traveling at 88.88 miles per hour.
Program ended with exit code: 0

我们定义一个自行车Bicycle的子类,继承自Vehicle,如上,它拥有Vehicle的所有特性,并且拥有一个新的属性hasBasket,同时它还能修改从Vehicle继承而来的currentSpeed属性。

重写

重写指:子类可以为继承来的实例方法、类方法、实例属性或者下标提供自己定制的实现。
在需要重写的特性前面加上override关键字,表明该特性是重写版本的,而非错误提供的相同的版本。任何缺少override关键字的重写,在编译时都会被诊断为错误。

1.访问父类的方法、属性或下标

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

1.在方法someMethod()的重写实现中,可以通过super.someMethod()来调用超类版本的someMethod()方法。
2.在属性somePropertygettersetter 的重写实现中,可以通过super.someProperty来访问超类版本的someProperty属性。
3.在下标的重写实现中,可以通过super[someIndex] 来访问超类版本中的相同下标。

2.重写方法

如下,我们在Bicycle方法中重写makeNoise( )方法,

class Bicycle: Vehicle
{
    var hasBasket:Bool = false
    override func makeNoise()
    {
        print("This is override functon")
    }
}

运行结果

The bicycle does have basket.
Traveling at 88.88 miles per hour.
This is override functon
Program ended with exit code: 0

3.重写属性

重写属性的getters和setters

无论继承来的属性是存储型的还是计算型的,我们都可以提供定制的getter(或者setter)来重写它。子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性有一个名称和类型。所以,我们在重写属性的是弘扬,必须将它的名字和类型都写出来。
如下,我们在Bycicle中重写Vehicledescription:String属性

    override var description: String
    {
        return super.description + "And it is \(currentSpeed >= 60 ? "":"not") overspeed"
    }

注意:

我们可以将一个继承来的只读属性重写为一个读写属性,只需要在重写版本的属性里提供gettersetter 即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。因为如果我们在重写属性中提供了setter,那么你也一定要提供getter。如果你不想在重写版本中的getter里修改 继承来的属性值,你可以直接通过super.someProperty来返回继承来的值,其中someProperty是你要重写的属性的名字。

重写属性观察器

我们可以通过重写属性为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,我们就会被 通知到,无论那个属性原本是如何实现的。
有下面两点需要注意

如下例子

class Car: Vehicle
{
    var gear:Int = 1

    override var currentSpeed: Double
    {
        didSet
        {
            gear = Int(currentSpeed/10) + 1
        }
    }

    override var description: String
    {
        return super.description + "in gear \(gear)"
    }
}

let car = Car.init()
car.currentSpeed = 35.88
print("\(car.description)")

运行结果

Traveling at 35.88 miles per hour.in gear 4
Program ended with exit code: 0

在上面的例子中,我们重写了currentSpeed属性,添加了属性观察器,在属性观察器中,每次currentSpeed的值发生变化,就会更新gear的值。

防止重写

如下例子:

final class Car: Vehicle
{
    final var gear:Int = 1

    final func makeTimes()
    {
        print("Final function")
    }

    override var currentSpeed: Double
    {
        didSet
        {
            gear = Int(currentSpeed/10) + 1
        }
    }

    override var description: String
    {
        return super.description + "in gear \(gear)"
    }
}
上一篇 下一篇

猜你喜欢

热点阅读