面向对象实验Word下载.docx
《面向对象实验Word下载.docx》由会员分享,可在线阅读,更多相关《面向对象实验Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
1.培养信息类专业学生的面向对象编程技术基本能力。
2.掌握C#程序设计语言。
3.了解面向对象编程的基本概念。
熟练掌握类的封装、继承、多态(运行时多态、编译时多态)的概念与实现,掌握属性、泛型、索引器的概念与实现,掌握抽象类与接口的概念与实现。
二、实验(正文)
1.在UserControl基类基础上设计一个Windows控件DrawArea。
2.设定DrawObject、ToolObject抽象基类的基本属性与方法。
3.设定DrawRectangle(DrawObject为其父类)、ToolRectangle(ToolObject为其父类)抽象子类的基本属性与方法。
4.设定DrawRectangle子实体类:
DrawBreak、DrawCapacitor、DrawKnife、DrawPower、DrawTransformer2、DrawTransformers3的基本属性与方法。
5.设定ToolRectangle子实体类:
ToolBreak、ToolCapacitor、ToolKnife、ToolPower、ToolTransformer2、ToolTransformer3的基本属性与方法。
6.设定实体类DrawLine(DrawObject为其父类)、ToolLine(ToolObject为其父类)、ToolPointer(ToolObject为其父类)的基本属性与方法。
7.构造客户端应用程序DrawElectricityElements.exe,调用DrawArea控件实现电力设备绘图系统。
实现过程
1.在DrawObject基类基础上设计变压器类、开关类、刀闸类、母线类、发电机类、电容器类。
基类DrawObject的设计与实现,程序代码如下:
publicabstractclassDrawObject
{
#region属性部分
#region构造函数
#region与图形操作有关的方法
#region与锚点有关的方法
#region判断与点的位置有关的方法
#region判断与矩形位置有关的方法
}
2.在DrawObject中定义了画图draw的虚方法:
publicvirtualvoiddraw(Graphicsg),且画各种器件的共同点是:
都可以把器件放到矩形RectangleF中来画。
父类DrawRectangle的设计与实现,代码如下:
publicabstractclassDrawRectanlge:
DrawObject
{
#region属性部分
#region一般方法
///<
summary>
///移动图形
/summary>
paramname="
deltaX"
>
<
/param>
deltaY"
publicoverridevoidMove(intdeltaX,intdeltaY)
rectangle.X+=deltaX;
rectangle.Y+=deltaY;
}
///规范化图形
publicoverridevoidNormalize()
rectangle=GetNormalizedRectangle(rectangle);
r"
returns>
/returns>
publicstaticRectangleGetNormalizedRectangle(Rectangler)
returnGetNormalizedRectangle(r.X,r.Y,r.X+r.Width,r.Y+r.Height);
p1"
p2"
publicstaticRectangleGetNormalizedRectangle(Pointp1,Pointp2)
returnGetNormalizedRectangle(p1.X,p1.Y,p2.X,p2.Y);
x1"
y1"
x2"
y2"
publicstaticRectangleGetNormalizedRectangle(intx1,inty1,intx2,inty2)
if(x2<
x1)
inttmp=x2;
x2=x1;
x1=tmp;
if(y2<
y1)
inttmp=y2;
y2=y1;
y1=tmp;
returnnewRectangle(x1,y1,x2-x1,y2-y1);
3.开关类的设计思路:
在Breaker.cs中,根据开关的形状定义矩形privateRectangleFri(i=1~5),且定义函数computer来计算矩形起点的位置和矩形宽和高publicvoidcomputer(),然后覆写DrawObject类中的画图draw的虚方法publicoverridevoiddraw(System.Drawing.Graphicsg)。
画矩形:
g.DrawRectangle(pen,x+(float)1.5*d,y+(1*d),3*d,2*d);
画线:
g.DrawLine(pen,newPointF(x+0*d,y+2*d),newPointF(x+(float)1.5*d,y+2*d));
g.DrawLine(pen,newPointF(x+(float)4.5*d,y+2*d),newPointF(x+6*d,y+2*d));
其他电器元件的画法与开关类的画法基本一致,就是多了一个画椭圆的方法:
g.DrawEllipse(pen,newRectangleF(x+(float)0.5*d,y+(float)1.5*d,1*d,1*d));
下面不再叙述,只展示各类电器元件代码
子类Break(开关)的设计与实现,代码如下:
publicclassDrawBreak:
DrawRectanlge
publicDrawBreak(intx,inty,intwidth,intheight)
:
base(x,y,width,height)
base.Name="
开关"
;
publicDrawBreak()
this(0,0,80,40)
privateboolopenOrclose=false;
///表示开关状态
publicoverrideboolOpenOrClose
get
returnopenOrclose;
set
openOrclose=value;
///开关操作
publicvoidSwitch()
if(openOrclose==false)
openOrclose=true;
else
openOrclose=false;
///画图方法
g"
publicoverridevoidDraw(System.Drawing.Graphicsg)
base.Draw(g);
Penpen=newPen(base.Color,base.PenWidth);
Rectanglerect=DrawRectanlge.GetNormalizedRectangle(base.rectangle);
intx=rect.X;
inty=rect.Y;
floatd=(float)rect.Width/6;
floatb=(float)rect.Height/6;
g.DrawLine(pen,newPointF(x+1*d,y+2*d),newPointF(x+2*d,y+2*d));
g.DrawLine(pen,newPointF(x+4*d,y+2*d),newPointF(x+5*d,y+2*d));
g.DrawLine(pen,newPointF(x+2*d,y+(float)1.5*d),newPointF(x+4*d,y+(float)1.5*d));
g.DrawLine(pen,newPointF(x+2*d,y+(float)2.5*d),newPointF(x+4*d,y+(float)2.5*d));
g.DrawLine(pen,newPointF(x+2*d,y+(float)1.5*d),newPointF(x+2*d,y+(float)2.5*d));
g.DrawLine(pen,newPointF(x+4*d,y+(float)1.5*d),newPointF(x+4*d,y+(float)2.5*d));
g.ResetTransform();
pen.Dispose();
4.子类Capacitor(电容器)的设计与实现,代码如下:
publicclassDrawCapacitor:
publicDrawCapacitor(intx,inty,intwidth,intheight)
电容器"
publicDrawCapacitor()
this(0,0,120,80)
publicoverridevoidDraw(Graphicsg)
g.SmoothingMode=SmoothingMode.AntiAlias;
g.DrawLine(pen,newPointF(x+1*d,y+2*d),newPointF(x+(float)2.5*d,y+2*d));
g.DrawLine(pen,newPointF(x+(float)3.5*d,y+2*d),newPointF(x+5*d,y+2*d));
g.DrawLine(pen,newPointF(x+(float)2.5*d,y+1*d),newPointF(x+(float)2.5*d,y+3*d));
g.DrawLine(pen,newPointF(x+(float)3.5*d,y+1*d),newPointF(x+(float)3.5*d,y+3*d));
5.子类Knife(刀闸)的设计与实现,代码如下:
publicclassDrawKnife:
publicDrawKnife(intx,inty,intwidth,intheight)
刀闸"
publicDrawKnife()
publicvirtualboolOpenOrClose
g.DrawEllipse(pen,newRectangleF(x+(float)0.5*d,y+(float)1.5*d,1*d,1*d));
g.DrawEllipse(pen,newRectangleF(x+(float)4.5*d,y+(float)1.5*d,1*d,1*d));
g.DrawLine(pen,newPointF(x+0*d,y+2*d),newPointF(x+(float)0.5*d,y+2*d));
g.DrawLine(pen,newPointF(x+(float)5.5*d,y+2*d),newPointF(x+6*d,y+2*d));
g.DrawLine(pen,newPointF(x+1*d,y+(float)1.5*d),newPointF(x+5*d,y+0*d));
6.子类Power(电源)的设计与实现,代码如下:
publicclassDrawPower:
publicDrawPower(intx,inty,intwid,inthei)
base(x,y,wid,hei)
电源"
publicDrawPower()
g.TranslateTransform(x+3*d,y+3*b);
g.RotateTransform(Angle);
g.TranslateTransform(-x-2*d,-y-2*b);
g.DrawEllipse(pen,newRectangleF(x+1*d,y+0*d,3*d,2*d));
g.DrawBezier(pen,newPointF(x+1*d,y+1*d),newPointF(x+(float)2.5*d,y+0*d),newPointF(x+(float)2.5*d,y+2*d),newPointF(x+4*d,y+1*d));
g.DrawLine(pen,newPointF(x+4*d,y+1*d),newPointF(x+5*d,y+1*d));
7.子类Transformer2(二绕组变压器)的设计与实现,代码如下:
publicclassDrawTransformer2:
publicDrawTransformer2(intx,inty,intwidth,intheight)
双绕变压器"
publicDrawTransformer2()
floatd=(float)rect.Width/6;
floatb=(float)rect.Height/6;
g.TranslateTransform(-x-3*d,-y-3*b);
g.DrawEllipse(pen,newRectangleF(x+1*d,y+(float)(0.5*d),3*d,3*d));
g.DrawEllipse(pen,newRectangleF(x+2*d,y+(float)(0.5*d),3*d,3*d));
g.DrawLine(pen,newPointF(x+0*d,y+2*d),newPointF(x+1*d,y+2*d));
g.DrawLine(pen,newPointF(x+5*d,y+2*d),newPointF(x+6*d,y+2*d));
8.子类Transformer3(三绕组变压器)的设计与实现,代码如下:
publicclassDrawTransformer3:
publicDrawTransformer3(intx,inty,intwidth,intheight)
三绕变压器"
publicDrawTransformer3()
bas