Помощь в составлении иерархии классов. C#

Подскажите как можно было бы создать корректную иерархию классов(или хотя бы такую, после просмотра которой не закидают чем-нибудь).

Есть абстрактный класс Figure. У него есть абстрактные методы для нахождения периметра/площади(все фигуры должны переопределять эти методы).

Далее уже идут классы типа Circle, Square и т.д. Ключевое отличие всех классов, унаследованных от Figure, в моем случае, это наличие либо радиуса, либо сторон.

Как можно было бы назвать промежуточные классы для хранения Радиуса/Сторон, чтобы избежать дублирования кода? И можно ли вообще?

Пример.

public abstract class Figure : IFigure
{
    public abstract double GetArea();

    public abstract double GetPerimeter();

    public override string ToString() => $"Figure type: {GetType().Name}; Perimeter: {GetPerimeter()}; Area: {GetArea()};";
}
public abstract class Circle : Figure
{
    protected double Radius { get; set; }

    protected Circle(double radius) => Radius = radius;

    protected Circle(double radius, IFigure cutOutFigure)
    {
        Radius = radius;
        if (GetArea() > cutOutFigure.GetArea())
        {
            throw new OutOfAreaException("You can't cut a figure because the original shape is smaller", this, cutOutFigure);
        }
    }

    public override double GetPerimeter() => Math.Round(2 * Math.PI * Radius, 2);

    public override double GetArea() => Math.Round(Math.PI * Radius * Radius, 2);

    public override bool Equals(object obj) => obj is Circle circle && Radius == circle?.Radius;

    public override int GetHashCode() => 598075851 + Radius.GetHashCode();
}
public abstract class Rectangle : Figure
{
    protected List<double> Sides { get; set; }

    protected Rectangle(IEnumerable<double> sides) => Sides = sides.ToList();

    protected Rectangle(IEnumerable<double> sides, IFigure cutOutFigure)
    {
        Sides = sides.ToList();
        if (GetArea() > cutOutFigure.GetArea())
        {
            throw new OutOfAreaException("You can't cut a figure because the original shape is smaller", this, cutOutFigure);
        }
    }

    public override double GetArea() => Math.Round(Sides[0] * Sides[1], 2);

    public override double GetPerimeter() => Math.Round(2 * (Sides[0] * Sides[1]), 2);

    public override bool Equals(object obj) => obj is Rectangle rectangle && EqualityComparer<List<double>>.Default.Equals(Sides, rectangle.Sides);

    public override int GetHashCode() => 1814305551 + Sides.GetHashCode();
}

Как видно из примера, класс Circle содержит поле Radius, а класс Rectangle содержит Sides. И сейчас получается так, что у меня есть еще классы, типа, Square, Triangle, у которых тоже есть поле Sides и точно такие же конструкторы, как у Rectangle. По аналогии есть класс Ball, где есть поле Radius и такой же конструктор, как и Circle. Получается дублирование. Вот я и хочу добавить каких-то 2 промежуточных класса, чтобы они хранили поля Radius и Sides, определяли нужные конструкторы соответственно.


Ответы (1 шт):

Автор решения: default locale

... класс Rectangle содержит Sides. И сейчас получается так, что у меня есть еще классы, типа, Square, Triangle, у которых тоже есть поле Sides.

Вроде бы это все многоугольники, можете назвать их общего предка Polygon.

По аналогии есть класс Ball, где есть поле Radius и такой же конструктор, как и Circle.

Тут и мне не приходит в голову очевидно удачный вариант. Более или менее подходят Circular или Round. Если не нравится прилагательное в названии класса, то можно CircularShape, RoundShape, RadiusShape или даже ShapeWithARadius.

P.S. Вообще, названия это дело вкуса, главное чтобы код было удобно писать. В посте два вопроса, которые больше относятся к английскому языку чем к программированию. Ну да и ладно.

→ Ссылка