问答题

【说明】 现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1, y1,x2,y2)画一条直线,DF2则用drawline(x1,x2,y1,y2)画一条直线。当实例画矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现 部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图9-7显示了各个类间的关系。
这样,系统始终只处理3个对象:Shape对象、Drawing对象、DP1或DP2对象。以下是 C++语言实现,能够正确编译通过。 【C++代码】 class DP1{ public: static void draw_a_line(double x1, double y1,double x2, double y2){ //省略具体实现 } ); class DP2{ public: static void drawline(double x1, double x2,double y1, double y2){ //省略具体实现 } }; class Drawing{ public: (1) void drawLine(double x1,double y1,double x2,double y2)=0; }; class V1Drawing:public Drawing{ public: void drawLine(double x1, double y1,double x2, double y2){ DP1::draw_a_line(x1,y1,x2,y2); } }; class V2Drawing:public Drawing{ public: void drawLine(double x1, double y1, double x2, double y2){   (2) ; } }; class Shape{ private: (3) _dp; public: Shape(Drawing *dp); virtual void draw()=0; void drawLine(double x1, double y1, double x2, double y2); }; Shape::Shape(Drawing *dp) { _dp = dp; } void Shape::drawLine(double x1, double y1, double x2, double y2) { //画一条直线   (4) ; } class Rectangle: public Shape{ private: double _x1,_y1,_x2,_y2; public: Rectangle(Drawing *dp, double x1, double y1, double x2, double y2); void draw(); }; Rectangle::Rectangle(Drawing *dp, double x1, double y1, double x2, double y2) : (5) { _x1=x1;_y1=y1;_x2=x2;_y2=y2; } void Rectangle::draw() { //省略具体实现 }

【参考答案】

(1) virtual (2) DP2::drawline(x1,x2,y1,y2) (3) Drawing (4) _......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
【说明】 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为: m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2] 其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数,1表示负数。 运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减的情况。注:不考虑溢出情况,即数组足够大。 【函数】 int cmp(int *LA, int *LB); *比较长整数LA与LB的绝对值大小* *若LA绝对值较大返回正值,LA较小返回负值,相等则返回0* int ADD(int *LA, int*LB, int *LC) *计算长整数LA与LB的和,结果存储于LC中* *注意:正数与负数的和相当于正数与负数绝对值的差* *数据有误返回0,正常返回1* { if(LA==NULL || LB==NULL || LC==NULL)return 0; int *pA, *pB,i,N,carry,flag; flag=LA[0]+LB[0]; switch(flag){ *根据参与运算的两个数的符号进行不同的操作* case 0: case 2: LC[0]=LA[0]; *LA与LB同号,结果符号与LA(LB)相同* pA=LA; pB=LB; (1) ; break; case 1: *LA与LB异号* *比较两者的绝对值大小,结果符号与较大者相同* flag= (2) ; if(flag>0){ *LA较大* LC[0]=LA[0]; pA=LA; pB=LB; } else if(flag<0){ *LB较大* LC[0]=LB[0]; pA=LB; pB=LA; } else{ *LA与LB相等* LC[0]=0; LC[1]=0; return 1; } flag=-1; break; default: return 0; break; } *switch* *绝对值相加减* *注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减的情况* (3) ; N=LA[1]>LB[1]LA[1]:LB[1]; for(i=0;i<N;i++){ if(i>=pA[1]){ *LA计算完毕* carry+=flag *pB[i+2]; } else if(i>=pB[1]){ *LB计算完毕* carry +=pA[i+2]; } else{ carry +=pA[i+2]+flag *pB[i+2]; } LC[i+2]=Carry%10; carry =10; if( (4) ){ *需要借位,针对减法* LC[i+2]+=10; carry--; } } *for* if( (5) ){ *最高进位,针对加法* LC[i+2]=carry; i++; } if(LC[i+1]==0)i--;严若最高位为零,针对减法* LC[1]=i; return 1; }; *ADD*