Оптимизация решения задачи, наследование

Рейтинг: 0Ответов: 1Опубликовано: 10.02.2023

Было такое задание "Написать программу, в которой описана иерархия классов: геометрические фигуры (ромб, параллелограмм, эллипс). Реализовать методы вычисления площади и периметра. Предусмотреть у класса наличие полей, методов и свойств. Использовать переопределение методов."

Создал базовый абстрактный класс геометрических фигур, от него наследовал два класса - параллелограмм и эллипс. Хочу понять, можно ли как-то улучшить/оптимизировать код, и понять, что можно убрать или добавить в абстрактном классе

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}");
    }
}

Не знаю как вам удобнее, но мне удобнее члены класса писать в таком порядке: поля и константы, свойства, конструктор, методы.