在程序定义抽象基类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; }
}
}