Помощь в составлении иерархии классов. 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 шт):
... класс Rectangle содержит Sides. И сейчас получается так, что у меня есть еще классы, типа, Square, Triangle, у которых тоже есть поле Sides.
Вроде бы это все многоугольники, можете назвать их общего предка Polygon.
По аналогии есть класс Ball, где есть поле Radius и такой же конструктор, как и Circle.
Тут и мне не приходит в голову очевидно удачный вариант. Более или менее подходят Circular или Round. Если не нравится прилагательное в названии класса, то можно CircularShape, RoundShape, RadiusShape или даже ShapeWithARadius.
P.S. Вообще, названия это дело вкуса, главное чтобы код было удобно писать. В посте два вопроса, которые больше относятся к английскому языку чем к программированию. Ну да и ладно.