У меня есть базовый абстрактный класс Shape
с тремя производными классами: Arc
, Circle
, Rectangle
.
У меня есть проверка на равенство в классах, и поскольку дуги иногда могут иметь формуполного круга, я хочу считать их также равными!Для этого я проверяю тип фигуры, уменьшаю ее, а затем выполняю другие проверки, чтобы увидеть, действительно ли две фигуры представляют одну и ту же геометрию.Моя проблема здесь с понижением.
Разве это не запах кода?Как я могу сделать это правильно.
Например, скажем, в будущем кто-то наследует от Shape и создает класс, который также может иметь форму, аналогичную дуге!Поскольку я не учел это в условиях проверки на равенство, у меня возникнут проблемы!
public abstract class Shape : IEquatable<Shape>
{
public abstract bool Equals(Shape other);
}
public class Arc : Shape
{
public override bool Equals(Shape other)
{
if (other is Arc || other is Circle)
{
// Downcast and check for equality criteria!!
}
else
{
return false;
}
}
}
public class Circle : Shape
{
public override bool Equals(Shape other)
{
if (other is Arc || other is Circle)
{
// Downcast and check for equality criteria!!
}
else
{
return false;
}
}
}
public class Rectangle : Shape
{
public override bool Equals(Shape other)
{
if (other is Rectangle)
{
// Downcast and check for equality criteria!!
}
else
{
return false;
}
}
}
ОБНОВЛЕНИЕ:
После прочтения ответов и обдумывания чуть-чуть дальшеЯ считаю, что мне нужно изменить свой дизайн следующим образом:
Класс Shape должен иметь такие методы, как IsEqualToCircle (Circle circle) и IsEqualToCircle (Arc arc).
Тогда в равенстве класса Arc Iможно написать: if(shape.IsEqualToArc(this) return true;
) и т. д.
Пример, показанный здесь, является просто упрощением, чтобы показать проблему, которая возникает для меня во многих ситуациях.Конечно, это не настоящий код.