(2013年下半年下午试题五)阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表10.4所示。 根据绘图软件

admin2018-07-27  25

问题 (2013年下半年下午试题五)阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表10.4所示。

根据绘图软件的扩展性要求,该绘图软件将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如图10.15所示的类图。

【C++代码】
Class DP1{
public:
    static void draw a line(double x1,double y1,double x2,double y2){/*代码省略*/}
    static void draw a circle(double x,double y,double r){/*代码省略*/{
};
class DP2{
public:
    static void drawline(double x1,double x2,double y1,double y2){/*代码省略*/{
    static void drawcircle(double x,double y,double r){/*代码省略*/{
},
class Drawing{
public:
    ____(1);
    ______(2);
};
class V1Drawing:public Drawing {
public:
    void drawLine(double x1,double y1,double x2,double y2){/*代码省略*/}
    void drawCircle(double x,double y,double r){ _____(3);}
};
class V2Drawing:public Drawing{
public:
    void drawLine(double x1,double y1,double x2,double y2){/*代码省略*/}
    void drawCircle(double x,double y,double r){ _____(4);}
  };
  class Shape{
  public:
    ______(5)l
    Shape(Drawing*dp){dp=dp;}
    void drawLine(double x1,double y1,double x2,double y2){
    dp->drawLine(x1,y1,x2,y2);}
    void drawCircle(double x,double y,double r){dp->drawCircle(x,y,r);}
private:Drawing *_dp;
};
class Rectangle:public Shape{
public:
    void draw(){  /*代码省略*/  }
    //其余代码省略
};
class Circle:public Shape{
private:double_x,_y,_r;
public:
    Circle(Drawing*dp,double x,double y,double r):____(6)  {_x=x;_y=y;_r=r;}
    void draw(){drawCircle(_x,_y,r);}
};

选项

答案(1)virtual void drawLine(double x1,double y1,double x2,double y2) (2)virtual void drawCircle(double x,double y,double r) (3)DP1.draw_a circle(x,y,z) (4)DP2.drawcircle(x,y,z) (5)virtual void draw()(6)Shape(dp)

解析 本题考查桥接模式的概念及应用。桥接模式将抽象与其实现解耦,使它们都可以独立地变化。也就是说,将一组实现与另一组使用它们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。
    本题中,Drawing是一个虚拟基类,里面包含了希望不同策略实现的算法。派生类V1Drawing、V2Drawing都派生自Drawing,对基类中希望实现的算法都做了具体实现,且它们都含有drawLine和drawCircle函数,所以Drawing类中缺失的应该是这两个算法,于是空(1)处应填入virtual void drawLine(double x1,double y1,double x2,double y2,空(2)处应填入virtual void draw Circle(double x,double y.double r)。DP1和DP2中包含了绘制Line和Circle的具体实现的static方法,因此在V1Drawing、V2Drawing类中可以直接进行调用,所以空(3)处应填入DP1.draw a circle(x,y,z),空(4)处应填入DP2.drawcircle(x,y,z)。Shape类派生出Rectangle和Circle类,里面都含有draw方法,但是具体draw方法的实现却不相同,所以空(5)处应填入virtual void draw()。最后Circle的构造函数初始化了后四个变量,还有继承自Shape的变量*dp未做初始化,因此调用Shape的构造函数做初始化,即空(6)处应填入shape(dp)。
转载请注明原文地址:https://kaotiyun.com/show/mzxZ777K
0

相关试题推荐
最新回复(0)