说了那么多次的重写,这次我们就来认真的对待一下方法的重写。
合约
我们说了,继承就相当于是签订合约,我们继承出来的子类一定要遵守这个合约,那么就算你想要做一些合约里没有的事情,也要遵守合约的规范,所以,你重写方法,也一定要符合方法的类型。
我们讲过方法的类型,它以 ()->() 这样来表示。所以,重写的方法也一定要遵守这个类型即接收参数返回参数类型要相同……名字要相同还需要我说吗?
重写
override ,这个关键词我搞不懂为什么会被翻译为超驰,另外还好大家都没有在 Swift 里翻译成超驰而是翻译成了重写:
所谓超驰控制就是当自动控制系统接到事故报警、偏差越限、故障等异常信号时,超驰逻辑将根据事故发生的原因立即执行自动切手动、优先增、优先减、禁止增、禁止减等逻辑功能,将系统转换到预设定好的安全状态,并发出报警信号。
这里我把它翻译为重写,虽然说覆盖更恰当——但重写更直观吧。我们已经重写过很多方法了:
1 2 3 4 5 6 |
class MachineGun:Weapon { override func fire() { print("dadadada!") } } |
使用 override 来重写,除了要保证“履约”:名字相同类型相同外,访问权限也的修改只能提高不能降低,也就是说,如果你给父类重写顺带加一个 private 前缀是不可接受的:
但是,如果你要尝试提高权限:
这里说没有意义,是因为方法的权限比所在类高了——这样方法一样不会被访问到。
权限问题
很遗憾我们的大纲里没有包括权限这部分的课程,那我这里就简单来提一下:
在 Swift 中我们有三种权限:
- public
- internal
- private
前一个和后一个我们都懂,中间那个是什么呢?——其实它就是默认的,如果你不声明权限前缀,那么默认就是 internal。
public 就不说了,private 也好理解,是私人日记。internal 的范围则是你开发的一个项目的范围,别的项目不能访问。
与之无关的东西
如果你在重写一个方法的时候忘记写 override 关键字,那 Xcode 会提示你,但如果你没有理会同时又写错了方法的类型——那么恭喜你,编译器不会报错,而是认为你重载了这个方法。
它与继承没有任何关系,只是另外一个方法恰好有了与父类方法相同的名字罢了……对于多态来说,编译器依旧可以用函数类型来区分这两个具有相同名称的方法——就好像总有重名的人一样。
对于重载的方法,你可以理解为两个方法只是碰巧重名罢了,在多态里依旧会调用父类的那个方法,如果你单独调用,就会看到这样的提示了:
所以对于它的存取权限你就随意了。
课后题
考虑到根本没人做,不留了。
本文由 落格博客 原创撰写:落格博客 » 自定义:override!
转载请保留出处和原文链接:https://www.logcg.com/archives/1123.html
Comments