众所周知,在C++,C# 等面向对象开发语言中,虚方法(函数)是实现“多态”的基础,其实现原理:运行系统将根据对象的类型,自动选择适当的具体实现运行,没有定位虚方法的方法将不具备此特性。而要声明虚方法,就不得不依赖关键字"virtual"。
在C++,C#等面向对象开发语言中,虚方法是支持继承的,且在使用的时候,还要注意以下几点:
一旦在基类里把某个方法声明为虚方法,在子类里就不可能再把它声明为一个非虚方法了。
如果拿不准要不要把某个方法声明为虚方法,那么最好把他声明为虚方法。
在基类里把所有的方法都声明为虚方法会让最终生成的可执行代码的速度变得稍微慢一些,但是好处是可以一劳永逸的确保程序的行为符合预期。
在实现一个多层次的继承关系时,顶级的基类应该只有虚方法。
析构器都是虚方法,从编译的角度看,他们只是普通的方法。如果他们不是虚方法,编译器就会根据他们在编译时的类型而调用哪个在基类里定义的版本(构造器),那样的话,有可能导致内存泄露。
在C++中,只要在普通方法之前加上virtual关键字,就可以表示虚方法。
但在oc中,很难找到virtual关键字或其等价的,其实oc中不但有虚方法,甚至所有的方法都是虚方法。
在oc中,覆盖积累的方法只需要重写即可。无需加任何关键字。但是在覆盖其他基类的方法时,必须决定是否要替换基类的方法的行为,或者扩展或者补充该行为。如果想要替换基类的行为,提供自己的方法实现即可;如果想要扩展该基类的行为,调用基类实现,并提供自己的代码即可。
通过发送消息(与调用方法的消息相同)到super来调用基类实现。通过将消息发送给super,就将该方法的基类代码插入到重新实现的调用点。
如果打算补充基类的实现行为,应该调用super。
如果打算替换基类的实现行为,就不用调用super。
在oc中,实现这种"纯虚方法"的类似功能,可以采用正式协议来实现,正式协议的方法,所有实现这个协议的类都必须实现。这就是一种验证,也就是说,只要这个类可以实现这个协议,那么他肯定可以处理协议中规定的方法,一个类可以实现任意多个协议。
要点###
(1)在Objective_C中,所有的方法都是虚方法。
(2)实现纯虚方法,依靠正式协议来实现。
(3)协议并不是真正的类,它只能声明方法,不能添加数据。
(4)非正式协议并不是真正的协议,它对代码没有约束力。