控制台程序设计题设计一个控制台程序

在程序定义抽象基类Cicle,并在Circle类中定义数据成员半径r、圆心位置坐标p(x,y)(p(x,y)为另外一个Point类的对象)以及抽象方法GetArea()和GetVolume()方法。通过该Circle类派生出球体Sphere类和圆柱体Cylinder类以及圆锥体Cone类,在派生类中分别对计算面积方法GetArea()和体积的方法GetVolume()两个抽象方法进行了重写,并通过定义Showlnfo()方法显示基本信息。请通过生成对象的方式测试这个程序完成以下的要求:
要求:(1)通过生成派生类对象的方式,调用类的构造函数完成对象的初始化,具体数据可以由设计者给出.
(2)合理调用GetArea()和GetVolume()方法计算各个派生类对象的面积和体积,并且根据体积的大小排序后调用ShowInfo()方法依次显示输出体积和坐标位置信息。


using System;
using System.Linq;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Circle sphere = new Sphere(2, new Point(1, 1));
            Circle cylinder = new Cylinder(2, new Point(3, 3), 3);
            Circle cone = new Cone(2, new Point(5, 5), 3, 3);

            Compute(new Circle[] { sphere, cylinder, cone });

            Console.ReadLine();
        }

        static void Compute(Circle[] circles)
        {
            // 计算
            foreach(var item in circles)
            {
                item.GetArea();
                item.GetVolume();
            }
            // 排序,这里偷了各懒,就没有写算法了
            var ordered = circles.OrderBy(t => t.Volumn);
            foreach (var item in ordered)
            {
                item.ShowInfo();
            }
        }
    }

    class Sphere : Circle
    {
        public Sphere(double r, Point p) : base(r, p)
        {
        }

        public override double GetArea()
        {
            return 4 * Math.PI * R * R;
        }

        public override void GetVolume()
        {
            Volumn = 4 * Math.PI * R * R * R / 3;
        }
        
    }

    class Cylinder : Circle
    {
        public Cylinder(double r, Point p, double h) : base(r, p)
        {
            H = h;
        }
        public double H { get; set; }
        public override double GetArea()
        {
            return 2 * Math.PI * R * (R + H);
        }

        public override void GetVolume()
        {
            Volumn = Math.PI * R * R * H;
        }
    }

    class Cone : Circle
    {
        public Cone(double r, Point p, double l, double h): base(r, p)
        {
            L = l;
            H = h;
        }
        public double L { get; set; }
        public double H { get; set; }

        public override double GetArea()
        {
            return  Math.PI * R * R + Math.PI * R * L;
        }

        public override void GetVolume()
        {
            Volumn = Math.PI * R * R * H / 3;
        }
    }

    abstract class Circle
    {
        public Circle(double r, Point p)
        {
            R = r;
            P = p;
        }
        public double R { get; set; }

        public Point P { get; set; }

        public double Volumn { get; set; }

        public abstract double GetArea();

        public abstract void GetVolume();

        public void ShowInfo()
        {
            Console.WriteLine($"{this.GetType().Name}-坐标:({P.X},{P.Y}), 体积:{Volumn}");
        }
    }

    class Point
    {
        public Point(double x, double y)
        {
            X = x;
            Y = y;
        }
        public double X { get; set; }

        public double Y { get; set; }
    }

}