现在的位置: 首页 > 综合 > 正文

从面向过程到面向对象的思考

2013年09月19日 ⁄ 综合 ⁄ 共 3413字 ⁄ 字号 评论关闭

我本来学过一点C语言,不过没学深,后悔了。水平很菜,处于面向过程没学好,面向对象又不懂的阶段。我所理解的软件编程,就是用函数拼凑的。以前用VB6.0的时候,只知道双击Button按钮,里面捣鼓点代码进去。现在学.net。面对这么一个末知王国,有点晕。真不知道门在哪里?学了 老师的《.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 = 0.3f;

        //绘图的形状类型

        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类,并到基类中,可是基类是抽象类,抽象类是不能实例化的,所以基类只有一个抽象方法。

抱歉!评论已关闭.