Оптимизация решения задачи, наследование
Было такое задание "Написать программу, в которой описана иерархия классов: геометрические фигуры (ромб, параллелограмм, эллипс). Реализовать методы вычисления площади и периметра. Предусмотреть у класса наличие полей, методов и свойств. Использовать переопределение методов."
Создал базовый абстрактный класс геометрических фигур, от него наследовал два класса - параллелограмм и эллипс. Хочу понять, можно ли как-то улучшить/оптимизировать код, и понять, что можно убрать или добавить в абстрактном классе
abstract class GeometricFigure
{
public double SideLength { get; set; }
public abstract int NumberOfSides { get;}
public abstract void Print();
public abstract double GetPerimeter();
public abstract double GetSquare();
}
abstract class Parallelogram : GeometricFigure
{
public Parallelogram(double sideLength,double secondSideLength, double height)
{
SideLength = sideLength;
SecondSideLength = secondSideLength;
Height = height;
}
public double SecondSideLength { get; set; }
public double Height { get; set; }
public override int NumberOfSides
{
get { return 4; }
}
public override double GetPerimeter()
{
return 2 * (SideLength + SecondSideLength);
}
public override double GetSquare()
{
return SideLength * Height;
}
public override void Print()
{
Console.WriteLine($"Длина первой стороны: {SideLength}\nДлина второй стороны: {SecondSideLength}\nДлина высоты: {Height}");
}
}
class Rhombus : Parallelogram
{
public Rhombus(double sideLength, double secondSideLength, double height) : base(sideLength, secondSideLength, height)
{
}
public override double GetPerimeter()
{
return 4 * SideLength;
}
public override void Print()
{
Console.WriteLine($"Длина первой стороны: {SideLength}\nДлина второй стороны: {SecondSideLength}\nДлина высоты: {Height}");
}
}
class Ellipse : GeometricFigure
{
public Ellipse(double sideLength,double secondSideLength)
{
SideLength = sideLength;
SecondSideLength = secondSideLength;
}
const double PI = Math.PI;
public override int NumberOfSides
{
get { return 1; }
}
public double SecondSideLength { get; set; }
public override double GetPerimeter()
{
return 2 * PI * Math.Sqrt(Math.Pow(SideLength, 2) + Math.Pow(SecondSideLength, 2) / 2);
}
public override double GetSquare()
{
return PI * SideLength * SecondSideLength;
}
public override void Print()
{
Console.WriteLine($"Длина малой полуоси эллипса: {SideLength}\nДлина большой полуоси эллипса: {SecondSideLength}");
}
}
Ответы (1 шт):
Не надо ничего изобретать.
abstract class GeometricFigure
{
public abstract void Print();
public abstract double GetPerimeter();
public abstract double GetSquare();
}
Всё, больше ничего не надо.
Поля и свойства должны понятно называться. Всё лишнее следует убрать.
abstract class Parallelogram : GeometricFigure
{
public double FirstSide { get; }
public double SecondSide { get; }
public double Height { get; }
public Parallelogram(double firstSide, double secondSide, double height)
{
FirstSide = firstSide;
SecondSide = secondSide;
Height = height;
}
public override double GetPerimeter()
{
return 2 * (FirstSide + SecondSide);
}
public override double GetSquare()
{
return FirstSide * Height;
}
public override void Print()
{
Console.WriteLine($"Первая сторона: {FirstSide}\nВторая сторона: {SecondSide}\nВысота: {Height}");
}
}
class Rhombus : Parallelogram
{
public double Side => FirstSide;
public Rhombus(double side, double height) : base(side, side, height)
{
}
public override void Print()
{
Console.WriteLine($"Cторона: {Side}\nВысота: {Height}");
}
}
class Ellipse : GeometricFigure
{
public double FirstRadius { get; }
public double SecondRadius { get; }
public Ellipse(double firstRadius, double secondRadius)
{
FirstRadius = firstRadius;
SecondRadius = secondRadius;
}
public override double GetPerimeter()
{
return 2 * Math.PI * Math.Sqrt(Math.Pow(FirstRadius, 2) + Math.Pow(SecondRadius, 2) / 2);
}
public override double GetSquare()
{
return Math.PI * FirstRadius * SecondRadius;
}
public override void Print()
{
Console.WriteLine($"Первая полуось: {FirstRadius}\nВторая полуось: {SecondRadius}");
}
}
class Circle : Ellipse
{
public double Radius => FirstRadius;
public Circle(double radius) : base(radius, radius)
{
}
public override void Print()
{
Console.WriteLine($"Радиус: {Radius}");
}
}
Не знаю как вам удобнее, но мне удобнее члены класса писать в таком порядке: поля и константы, свойства, конструктор, методы.