|
可以很清晰的看到上边的代码就是一个子类覆盖了基类的虚拟方法的过程,而此时还不能很明确的提体出来多态的特性,或是说多态的本质问题还没有提体出来,并且您可能于晚期绑定也不是很明白,下边将给以解释。
当我们从抽象类TA派生出了类TB和TC,并且,子类也覆盖了基类的虚拟方法,现在如何应用这些方法呢?我们将以什么样的形式去调用这些方法呢?这才是多态最值得焦点的时刻,也是最能体现多态的本质的地方,之前已经给您灌输了多态的本质就是将子类类型的指针赋值给父类类型的指针,只要这样的赋值发生了,多态也就产生了,因为实行了“向上映射”。何以这样说呢?请继续我们的实例,假设它们的实现方法分别如下:
{ TC }
procedure TC.A;
begin
inherited;
{inherted的意思就是把相应的消息交给其父类去处理,他不属于我们讨论的范畴}
ShowMessage(''''TC'''' + C_Str);
end;
……
{ TB }
procedure TB.A;
begin
inherited;
ShowMessage(''''TB'''' + B_Str);
end;
……
现在我们就可以通过父类来来对子类进行调用,而这个过程其实就是一个“向上映射“的过程,既:子类类型的指针赋值给父类类型的指针;我们可以在此定义一个全局的过程来验证我们上边的话:
Procedure Test(Const pA : TA);
begin
pa.A;
{请将您的注意力放在此处,我们说了,TA是一个抽像类,它所提供的方法都是虚拟的,只有被覆盖了才可以进行应用,那么此处的处理是否是正确的呢?答案是肯定的,于是,多态在此处便提体的淋漓尽止,同时我也给出了调用的过程}
end;
procedure Tform.ButtonClick(Sender: TObject);
var
vTC : TC;
begin
vTC := TC.Create(''''多态实例_vTC'''');
Test(vTC);
vTC.Free;
end;
{此时你是否可以看明白了这种“向上映射“的机制呢?vTC做为一个子类TC的引用值(对象指针),完全可以赋值给其基类TA,于是,此处就发生了子类类型的指针赋值给父类类型的指针,于是多态就产生了!!!}
此处再一次的对晚期绑定或是动态进行说明:当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。
我想,此时,你应该对多态很明白了吧,那么我们讲了多态是OOP的一个重中之重,那么它倒底有什么作用?它给我们的项目将会带来什么效率上的飞跃呢?仅仅是为了完成某种实现方法吗?仅仅是作为一个概念而存在吗?这些都是我们在理解了多态之后必须去思考的东西。那么下边就多态将会如何的影响我们的效率进行阐述。我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!
如果还没有很明白多态,不妨参考下边的例子。
在这个问题上可以这样说:大炮可以打鸟,火枪也可以打鸟,你用那个?我不管是大炮还是火枪,我只知道他们都可以打鸟!向恐龙一样大的鸟我用大炮(就是一个例子,哪有那么大的鸟啊?打什么鸟对于长官来说就是一句话:打死它们,用什么?他不管),小鸟我用火枪。敌人来了我还可以打敌人,这就是动态的最终解释和一种接口重用! 有很多地方我是应用前辈的话。
}
在对OOP的总结部分,我想说一说我对现在的程序员的一些看法,或就我而言对于自己的OOP思想的渗透进行检讨,我曾一度的迷惑,的确,我一直认为Delphi的确是一个优秀的开发工具,高效、快速、易用……,然而在相当长的一段时间内,我不知道我作项目、写代码的时候是否有一些OOP渗透在里边?有种感觉,我好像只会将那些控件脱来应用,编码也仅仅是对其进行编码,可视化的界面设计,丰富多样的可用组件让我感觉很不安,我不知道自己是否只是如作图一样,从一个地方拉来一个图,然后只会对这个图进行修饰,虽然这让我对VCL组件有了很好的应用,可从来都没有过喜悦,一直都很郁闷,难道VCL只是给了我们这些吗?于是我不再疯狂的购买VCL组件使用的书。只有当自己接触了接口编程、组件技术时,我才发现我以前在很长一段时间里,甚至是贯穿于我的整个编程生涯到那时,只将注意力集中在Delphi提供的现有的VCL组件的使用上,而忽视去思考面向对象的思想对于Delphi的整个组件构架体系所蕴含的意义。我也才深深的明白了为什么曾有前辈在说“Delphi在毒害程序员”;在此,衷心的希望各位不要停留在VCL组件的使用上,而应该用面向对象的思想去理解Delphi的整个组件构架体系所蕴涵的意义。
在理解了OOP之后,我们对于组件所要必备的另一个知识点:接口 进行阐述,也许作为刚刚接触接口的您来说,这有些枯燥,但是必须给您说明的是,此处所说的接口将会百分百的引用到以后的组件技术或是组件对象中,因为它们最终就是对接口的实现、封装!
请关注下一篇文章。
转贴请注明 作者:dprogram
上一页 [1] [2] [3] 没有相关教程
|