C#中用抽象类实现形状的面积和周长

描述:计算形状Shape(圆Circle,矩形Square ,正方形Rectangle,三角形Triangle)的面积、周长。

分析:创建形状父类,并定义为抽象类,创建三个抽象方法,四个子类重写父类的三个方法,工厂中创建一个方法,供主程序调用执行。

具体实现代码如下:

//形状抽象类(父类)
    abstract class Shape
    {
        //面积
        public abstract double Area();
        //周长
        public abstract double Perimeter();
        //初始化数据
        public abstract void Initialization();
    }

//圆形
    class Circle:Shape
    {
        double r;
        public Circle()
        {
            Initialization();
        }

        public override double Area()
        {
            return Math.PI * Math.Pow(r,2);
        }

        public override double Perimeter()
        {
            return 2 * Math.PI * r;
        }

        public override void Initialization()
        {
            while (true)
            {
                Console.WriteLine("请选择输入圆的半径or直径,如下:");
                Console.WriteLine("1、半径 2、直径");
                string rStr = Console.ReadLine();
                string result = "";
                if (rStr=="1")
                {
                    Console.WriteLine("请输入圆的半径:");
                    result = Console.ReadLine();
                    if (!double.TryParse(result, out r))
                    {
                        Console.Write("输入数字非法,");
                        continue;
                    }
                    break;
                }
                else if (rStr == "2")
                {
                    Console.WriteLine("请输入圆的直径:");
                    result = Console.ReadLine();
                    if (!double.TryParse(result, out r))
                    {
                        Console.Write("输入数字非法,");
                        continue;
                    }                   
                    r = r / 2;
                    break;
                }
                else
                {
                    Console.Write("输入数字非法,");
                    continue;
                }  
            }
        }
    }

//长方形
    class Rectangle:Shape
    {
        double width;
        double height;
        public Rectangle()
        {
            Initialization();
        }

        public override double Area()
        {
            return width * height;
        }

        public override double Perimeter()
        {
            return 2 * (width + height);
        }

        public override void Initialization()
        {
            while (true)
            {
                Console.WriteLine("请选择输入长方形的长:");
                string widthStr = Console.ReadLine();
                Console.WriteLine("请选择输入长方形的宽:");
                string heightStr = Console.ReadLine();
                if (!double.TryParse(widthStr, out width) || !double.TryParse(heightStr, out height))
                {
                    Console.Write("输入数据出现非法字符,");
                    continue;
                }
                break;
            }
        }
    }

 //正方形
    class Square:Shape
    {
        double width;
        public Square()
        {
            Initialization();
        }
        public override double Area()
        {
            return Math.Pow(width,2);
        }

        public override double Perimeter()
        {
            return 4 * width;
        }

        public override void Initialization()
        {
            while (true)
            {
                Console.WriteLine("请输入正方形的边长:");
                string widthStr = Console.ReadLine();
                if (!double.TryParse(widthStr,out width))
                {
                    Console.Write("输入数据出现非法字符,");
                    continue;
                }
                break;
            }
        }
    }

//三角形
    class Triangle:Shape
    {       
        double height;
        double bottom;
        double side1;
        double side2;
        double side3;
        public Triangle()
        {
            Initialization();
        }

        public override double Area()
        {
            return bottom * height / 2;
        }

        public override double Perimeter()
        {
            return side1 + side2 + side3;
        }

        public override void Initialization()
        {
            while (true)
            {
                Console.Write("请输入三角形的底:");
                string bottomStr = Console.ReadLine();
                Console.Write("请输入三角形的高:");
                string heightStr = Console.ReadLine();
                Console.Write("请输入三角形第1个边长:");
                string side1Str = Console.ReadLine();
                Console.Write("请输入三角形第2个边长:");
                string side2Str = Console.ReadLine();
                Console.Write("请输入三角形第3个边长:");
                string side3Str = Console.ReadLine();
                if (!double.TryParse(bottomStr, out bottom) || !double.TryParse(heightStr, out height)
                     || !double.TryParse(side1Str, out side1) || !double.TryParse(side2Str, out side2)
                     || !double.TryParse(side3Str, out side3))
                {
                    Console.WriteLine("您输入的数据出现非法字符,请重新输入!");
                    continue;
                }
                break;
            }
        }
    }

//工厂
    class Factory
    {
        public static Shape CreateFunction(string name,double r,double width,double height)
        {
            switch (name)
            {
                case "1": return new Circle(r);
                case "2": return new Rectangle(width);
                case "3": return new Square(width,height);
                default:
                   // Console.WriteLine("系统找不到您选择的形状!");
                   //Console.ReadKey();
                    return null;
            }
        }
    }

//控制台主程序

static void Main(string[] args)
        {
            //输入
            Console.WriteLine("请选择您要计算的形状,如下:");
            Console.WriteLine("1、圆 2、正方形 3、长方形 4、三角形");
            string name = Console.ReadLine();
            Shape shape = Factory.CreateShape(name);
            if (shape!=null)
            {
                Console.WriteLine("面积为:{0}\r\n周长为:{1}", shape.Area(), shape.Perimeter());               
            }
            Console.Write("系统找不到指定的矩形,按任意键结束……");
            Console.ReadKey();
        }

  • 12
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值