我本来学过一点C语言,不过没学深,后悔了。水平很菜,处于面向过程没学好,面向对象又不懂的阶段。我所理解的软件编程,就是用函数拼凑的。以前用VB6.0的时候,只知道双击Button按钮,里面捣鼓点代码进去。现在学.net。面对这么一个末知王国,有点晕。真不知道门在哪里?学了
现在我用类来重新封装。简单说一下方法:我用一个抽象基类Shape()来抽象所有的图形。抽象基类Shape中定义一个DrawPicture()的抽象方法。其他圆Circle()线段Line()扇形Sector()多边形Polygon()都继承于Shape()类,实现DrawPicture()方法。原来的参数控制类不变DrawArgu(),New对象类的时候可以把DrawArgu()类作为参数传过去。
代码贴出来给大家看:
//参数控制类
public class DrawArgu
{
//绘图笔
public Pen p = Pens.Blue;
//递归次数
public int Recursion = 4;
//第每次绘制小圆数
public int CircleNums = 4;
//外圆与中心圆的半径比例
public float RadiusRateOfTwoCircles =
//绘图的形状类型
public enum PicShape
{
Circle = 0,
Line = 1,
Pie = 2,
Polygon = 3,
}
//默认形状为圆
public PicShape drawShope = PicShape.Circle;
//多边形的边数
public int PolSides = 3;
//默认是随机色
public bool UseRandomColor = true;
//默认画笔为黑色
public Color drawColor = Color.Black;
public Graphics g;
//图像尺寸
public int Width = 500;
public int Height = 500;
}
//抽象基类,抽象函数
abstract class Shape
{
public abstract void DrawPicture();
}
//圆
class Circle:Shape
{
private DrawArgu argu;
//构造函数传DrawArgu类
public Circle(DrawArgu ag)
{
argu = ag;
}
public override void DrawPicture()
{
//......
}
}
//线段
class Line:Shape
{
private DrawArgu argu;
//构造函数传DrawArgu类
public Circle(DrawArgu ag)
{
argu = ag;
}
public override void DrawPicture()
{
//......
}
}
//扇形
class Sector:Shape
{
private DrawArgu argu;
//构造函数传DrawArgu类
public Circle(DrawArgu ag)
{
argu = ag;
}
public override void DrawPicture()
{
//......
}
}
//多边形
class Polygon:Shape
{
private DrawArgu argu;
//多边形的边数
Private int Sides;
//构造函数传DrawArgu类
public Circle(DrawArgu ag,int PolygonSides)
{
argu = ag;
Sides=PolygonSides;
}
public override void DrawPicture()
{
//......
}
}
关键的调用类部分我是这样做的
//申明基类
Shape sp;
根据参数类drawShope字段New不同的对象给sp实现画图形
switch (argu.drawShope)
{
case DrawArgu.PicShape.Circle:
sp = new Circle(argu);
sp.DrawPicture();
break;
case DrawArgu.PicShape.Line:
sp = new Line(argu);
sp.DrawPicture();
break;
case DrawArgu.PicShape.Pie:
sp = new Sector(argu);
sp.DrawPicture();
break;
case DrawArgu.PicShape.Polygon:
{
int sides =(int)this.nudSides.Value;
sp = new Polygon(argu,sides);
sp.DrawPicture();
break;
}
}
这个程序让我思考如下:
1、 多态真的不错, sp.DrawPicture()方法在不同的对象中有不同的做法。
2、 以后程序扩展只要编写不同的图形类就可以了。而且各个类互不干扰。
3、 图形类都继承基类的DrawPicture()方法,使得对外部都可以用
Shape sp=new 图形类(DrawArgu argu);
sp.DrawPicture()
来画具体不同的图形。所以修改起来也很方便,外部几乎不用改,只要修改类里的DrawPicture()方法就行了。
4、 图形类不用全部实例化,只要根据基类的DrawShope字段来判断,需要哪个New哪个就行了。
我原来想吧,参数控件类DrawArgu类,并到基类中,可是基类是抽象类,抽象类是不能实例化的,所以基类只有一个抽象方法。