问答题 阅读以下说明和C++代码,将应填入______处的字句写在下面。
[说明]
欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。
不同的绘图程序
DPI DP2
绘制直线 draw a line(x1,y1,x2,y2) drawline(x1,x2,y1,y2)
绘制圆 draw a circle(x,y,r) drawcircle(x,y,r)
该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如下图所示的类图。
【正确答案】
【答案解析】virtual void drawLine(double x1,double y1,double x2,double y2)=0;
virtual void drawCircle(double x,double y,double r)=0;
DP1::draw_a_ircle(x,y,r);
DP2::drawCircle(x,y,r);
virtual void draw()=0
Shape(dp) [解析] 本题考查Bridge桥接模式的概念及应用,将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)
Drawing是一个虚拟基类,里面包含了希望不同策略实现的算法,派生类V1Drawing,V2Drawing都派生自Drawing,对基类中的希望实现的算法都作了具体实现,且它们都含有drawLine和drawCircle函数,所以Draw类中缺失的应该是这两个算法,于是:第一处为“virtual void drawLine(double x1,double y1,double x2,double y2=0;”第二处为“virtual void drawCircle(double x,double y,doubler)=0;”,DP1和DP2中包含了绘制Line和Circle的具体实现的Static方法,因此在V1Drawing、V2Drawing类中可以直接调用它们;(3)为“DP1::draw a circle(x,y,r);”,第四处为“DP2::drawCircle(x,y,r);”。Shape类派生出Rectangle和Circle类,里面都含有draw方法,但是具体draw方法的实现却不相同,所以第五处为“virtual void draw()=0;”,最后Circle的构造函数初始化了后4个变量,还有继承自shape的变量_dp未做初始化,因此调shape构造函数做初始化操作,第六处为“shape(dp);”。