Наследование и метод CompareTo() - C#
Формулировка задачи:
Добрый день. Задача следующая :
1. Создать абстрактный класс Figure с функциями вычисления площади и периметра, а также функцией, выводящей информацию о фигуре на экран.
2. В абстрактном классе Figure реализовать метод CompareTo так, чтобы можно было отсортировать объекты по их площадям.
3. Создать производные классы: Rectangle (прямоугольник), Circle (круг), Triangle (треугольник).
4. Создать массив n фигур и вывести полную информацию о фигурах на экран, отсортировав объекты по их площадям.
Мой код.
Файл test.txt
3
1 2
3
4 5 6 7
Насколько правильно написан метод Print();
Помогите разобраться.
using System;
using System.IO;
namespace ConsoleApplication17
{
abstract class Figure : IComparable
{
abstract public double Area();
abstract public double Perimeter();
abstract public void ShowFigure();
public int CompareTo(object obj)
{
Figure s = (Figure)obj;
if (Area() == s.Area())
{
return 0;
}
else if (Area() > s.Area())
{
return 1;
}
else
{
return -1;
}
}
static public Figure[] Input()
{
using (StreamReader fileIn = new StreamReader("d:/test.txt"))
{
int n = int.Parse(fileIn.ReadLine());
Figure[] ar = new Figure[n];
for (int i = 0; i < n; i++)
{
string[] text = fileIn.ReadLine().Split(' ');
if (text.Length == 2)
{
ar[i] = new Rectangle(int.Parse(text[0]), int.Parse(text[1]));
}
else if (text.Length == 1)
{
ar[i] = new Circle(double.Parse(text[0]));
}
else if (text.Length == 4)
{
ar[i] = new Triangle(double.Parse(text[0]), double.Parse(text[1]), double.Parse(text[2]), double.Parse(text[3]));
}
else
{
Console.WriteLine("Неверное количество аргументов");
}
}
return ar;
}
}
static public void Print(Figure[] array)
{
for (int i = 1; i < array.Length; i++)
{
if(array[i - 1].CompareTo(array[i]) < array[i].CompareTo(array[i -1]))
{
object temp = array[i - 1];
array[i - 1] = array[i];
array[i] = (Figure)temp;
}
}
foreach (Figure item in array)
{
item.ShowFigure();
}
}
}
}using System;
namespace ConsoleApplication17
{
class Triangle : Figure
{
private double a;
private double b;
private double c;
private double h;
public Triangle(double a, double b, double c, double h)
{
this.a = a;
this.b = b;
this.c = c;
this.h = h;
}
public override double Area()
{
return (a * h) / 2;
}
public override double Perimeter()
{
return a + b + c;
}
public override void ShowFigure()
{
Console.WriteLine("Площадь круга с основанием a = {0} и высотой h = {1}, равна {2}.", a, h, Area());
Console.WriteLine("Периметр круга со сторонами а = {0}, b = {1} и с = {2} равен {3}.", a, b, c, Perimeter());
}
}
}namespace ConsoleApplication17
{
class Circle : Figure
{
private double r;
public Circle(double r)
{
this.r = r;
}
public override double Area()
{
return 3.14 * Math.Pow(r, 2);
}
public override double Perimeter()
{
return 2 * 3.14 * r;
}
public override void ShowFigure()
{
Console.WriteLine("Площадь круга с радиусом r = {0} равна {1}.", r, Area());
Console.WriteLine("Периметр круга с радиусом r = {0} равен {1}.", r, Perimeter());
}
}
}using System;
namespace ConsoleApplication17
{
class Rectangle : Figure
{
private int a;
private int b;
public Rectangle(int a, int b)
{
this.a = a;
this.b = b;
}
public override double Area()
{
return a * b;
}
public override double Perimeter()
{
return (a + b) * 2;
}
public override void ShowFigure()
{
Console.WriteLine("Площадь прямоугольника со сторонами a = {0} и b = {1} равна {2}.", a, b, Area());
Console.WriteLine("Периметр прямоугольника со сторонами а = {0} и b = {1} равен {2}.", a, b, Perimeter());
}
}
}using System;
namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
Figure[] array = Figure.Input();
Figure.Print(array);
}
}
}Решение задачи: «Наследование и метод CompareTo()»
textual
Листинг программы
static public void SortAndPrint(Figure[] array)
{
Array.Sort(array);
foreach (Figure item in array)
item.ShowFigure();
}