虚拟函数实例展示
时间:2023-03-26 13:00:01 | 来源:营销百科
时间:2023-03-26 13:00:01 来源:营销百科
虚拟函数实例展示:下面通过一个简单的实例来展示这一优点。
假设有一个绘图程序允许用户在一个画布上绘制各种图形,如三角形、矩形和圆等,很自然地抽象图形的继承体系,如图2-2所示。
这个图形继承体系的设计大致如下:
为简单起见,让每个Shape对象都支持'绘制'和'旋转'操作,每个Shape的派生类对这两个操作都有自己的实现:
再来考虑这个图形继承体系的使用,这里很自然的一个使用者是画布,设计其类名为'Canvas':
Canvas类中维护一个包含所有图形的shapes,Canvas类在处理自己的业务逻辑时并不关心shapes实际上都是哪些具体的图形;相反,如①处和②处所示,它只将这些图形作为一个抽象,即Shape。在处理每个Shape时,调用每个Shape的某个操作即可。
这样做的一个好处是当图形继承体系发生变化时,作为图形继承体系的使用者Canvas而言,它的改变几乎没有,或者很小。
比如说,在程序的演变过程中发现需要支持多边型(Polygon)和贝塞尔曲线(Bezier)类型,只需要在图形继承体系中增加这两个新类型即可:
而不必修改Canvas的任何代码,程序即可像以前那样正常运行。同理,如果以后发现不再支持某种类型,也只需要将其从图形继承体系中删除,而不必修改Canvas的任何代码。可以看到,从对象继承体系的使用者(Canvas)的角度来看,它只看到Shape对象,而不必关心到底是哪一种特定的Shape,这是面向对象设计的一个重要特点和优点。