自定义:override!

说了那么多次的重写,这次我们就来认真的对待一下方法的重写。

合约

我们说了,继承就相当于是签订合约,我们继承出来的子类一定要遵守这个合约,那么就算你想要做一些合约里没有的事情,也要遵守合约的规范,所以,你重写方法,也一定要符合方法的类型。

我们讲过方法的类型,它以 ()->() 这样来表示。所以,重写的方法也一定要遵守这个类型即接收参数返回参数类型要相同……名字要相同还需要我说吗?

 

重写

override ,这个关键词我搞不懂为什么会被翻译为超驰,另外还好大家都没有在 Swift 里翻译成超驰而是翻译成了重写:

所谓超驰控制就是当自动控制系统接到事故报警、偏差越限、故障等异常信号时,超驰逻辑将根据事故发生的原因立即执行自动切手动、优先增、优先减、禁止增、禁止减等逻辑功能,将系统转换到预设定好的安全状态,并发出报警信号。

这里我把它翻译为重写,虽然说覆盖更恰当——但重写更直观吧。我们已经重写过很多方法了:

使用 override 来重写,除了要保证“履约”:名字相同类型相同外,访问权限也的修改只能提高不能降低,也就是说,如果你给父类重写顺带加一个 private 前缀是不可接受的:

重写的方法不能降低权限
重写的方法不能降低权限

但是,如果你要尝试提高权限:

虽然没有意义,但可以接受
虽然没有意义,但可以接受

这里说没有意义,是因为方法的权限比所在类高了——这样方法一样不会被访问到。

权限问题

很遗憾我们的大纲里没有包括权限这部分的课程,那我这里就简单来提一下:

在 Swift 中我们有三种权限:

  • public
  • internal
  • private

前一个和后一个我们都懂,中间那个是什么呢?——其实它就是默认的,如果你不声明权限前缀,那么默认就是 internal。

public 就不说了,private 也好理解,是私人日记。internal 的范围则是你开发的一个项目的范围,别的项目不能访问。

与之无关的东西

如果你在重写一个方法的时候忘记写 override 关键字,那 Xcode 会提示你,但如果你没有理会同时又写错了方法的类型——那么恭喜你,编译器不会报错,而是认为你重载了这个方法。

它与继承没有任何关系,只是另外一个方法恰好有了与父类方法相同的名字罢了……对于多态来说,编译器依旧可以用函数类型来区分这两个具有相同名称的方法——就好像总有重名的人一样。

对于重载的方法,你可以理解为两个方法只是碰巧重名罢了,在多态里依旧会调用父类的那个方法,如果你单独调用,就会看到这样的提示了:

屏幕快照 2015-08-06 下午5.19.21
碰巧同名的方法

所以对于它的存取权限你就随意了。

课后题

考虑到根本没人做,不留了。

“自定义:override!”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注