重写

现在,所有手机在开机时都会显示两句话:

加载中...
开机完成

因为所有手机的开机方法都是相同的:

func 开机():
    print("加载中...")
    已经开机 = true
    print("开机完成")

又一个新要求来了,之前那个能发短信的手机,为了显得与众不同,他们决定定制一个开机画面。

为了展示那个定制化开机画面,我们可以写一个新的 开机2.0 方法。不过,当一个外人拿到手机时,他可能会错误的使用老开机方法,导致没能看到炫酷的新开机画面,因此我们要做的不是加方法,而是改方法

重写是面向对象中一个重要的功能,它可以让我们在子类中覆盖父类的方法,从而实现方法名一样但效果不同的效果。

现在,来到我们的新手机类中,添加如下代码:

func 开机():
    print("嘟-嘟-嘟-.-.-.-")
    已经开机 = true
    print("Hello!")

我们又一次声明了开机方法,这与父类中的开机方法重名,这,就构成了重写,也就是子类的这个开机方法覆盖了父类的开机方法。

现在,当一个人拿到手机时,不论手机是什么型号,只要他开机,即可根据手机型号显示不同的开机画面。

子类调用父类

现在,这个新手机想要大力推广短信功能,它们决定在每次打电话前都显示一句“为什么不试试发短信呢?”这样的广告语。

为了达成这个目标,我们不希望完全覆盖父类的方法,而是希望在父类方法前或后添加自己的代码,这时候,我们可以在代码中使用 super 关键字引用父类实例并从中调用方法:

# 在子类中
func 打电话(电话号码:String):
    print("为什么不试试发短信呢?")

    # 调用父类的打电话方法
    super.打电话(电话号码)

现在,新手机在打电话时,会先显示那句广告,然后执行父类的打电话方法。

[!tip] 生命周期方法

其实那些 _ready、_process 等生命周期方法也是重写的父类方法。