阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表5-1所示。 该绘图软件的扩展性要求,将不断扩充新的图形和

admin2014-05-07  27

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

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

【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 xl,double x2,double y1,double y2){/*
代码省略*/  )
    static void drawcircle(double X,double y,double r){  /*代码省略*/  }
    };
    class Drawing{
    public:
    (1)    ;
   (2)    ;   
    };   
    class ViDrawing:public Drawing{
  pblic:   
    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 xl,double yl,double x2,double y2)  {/*代码
省略*/}
    void drawCircle(double x,double y,double r)(    (4)  ;  )
    };
    clasS Shape{
    public:
    (5)    ;
    Shape(Drawing*dp){_dp=dp;)
    void’drawLine(double x1,double y1,double x2,double y2){
    _dp->drawLine(xl,y1,x2,y2);  }
    void drawCircle(double X,double y,double r){_dp->drawCircle(x,y,
r);}
    private:Drawing*_dp;
    };
    clasS Rectangle:publlC 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)=0 (2)virtual void drawCircle(double x,double y,double r)=0 (3)DP1::draw_a_circle(x,y,r) (4)DP2::drawcircle(x,y,r) (5)virtual void draw()=0 (6)Shape(dp)

解析 本题考查桥接(Bridge)模式的概念及应用。
    Bridge模式可以将复杂的组件分成两个独立的、但又相关的继承层次结构:功能性的抽象和内部实现。改变组件的这两个层次结构很简单,以至于它们可以相互独立地变化。当具有抽象的层次结构和相应的实现层次结构时,Bridge模式是非常有用的。除了可以将抽象和实现组合成许多不同的类,该模式还可以动态组合的独立类的形式实现这些抽象和实现。
下图所示是Bridge模式的类图。

在以下情况中,应该使用Bridge模式:
想避免在抽象及其实现之间存在永久的绑定:
抽象及其实现可以使用子类进行扩展;
抽象的实现被改动应该对客户端没有影响,也就是说,不需要重新编译代码。
本题中,类Shape对应上图中的Abstraction,表示抽象部分;类Drawing对应Implementor,表示实现部分。这两个类的子类分别表示具体的抽象部分和实现部分。在  C++中,Drawing可以用抽象类来实现,将其中的方法定义为纯虚拟函数。因此(1)、(2)分别应为“virtual void drawLine(double x1,double y1,double x2,double y2)=0”、“virtual  void drawCircle(double x,double y’double r)=0”。
    V1Drawing是绘图实现类之一,它采用的绘图程序由是DP1所提供的。DP1中的方  法均为静态方法,必须用类名来引用。因此(3)处应为DP1::draw _a _circle(x,y,r)。同  理(4)处应为“DP2::drawcircle(x,y,r)”。
    由类图可以看出,Shape类中定义的方法draw在其子类中被重置了,而Shape表示  的是抽象部分,可以将draw方法定义为纯虚拟函数。所以,(5)应该为“virtual void  draw()=0”。
    空(6)处考查继承结构中子类构造函数的定义。构造子类对象时,需要调用基类  的构造函数,这可以通过初始化列表显式指明需要调用的基类的构造函数。在本题中,  Shape类只定义了一个构造函数,因此(6)应该为“Shape(dp)”。
转载请注明原文地址:https://jikaoti.com/ti/Vji7FFFM
0

最新回复(0)