Использование базовых типов хорошо, когда у вас есть общее поведение, которое вы хотите наследовать. В вашем случае у вас действительно есть общий способ взаимодействия с вашими типами, но поведение этих типов совсем другое.
В этом случае вы действительно пытаетесь определить общий интерфейс, чтобы вы могли одинаково относиться к своим типам.
Я бы определил следующее:
public interface IShape
{
string Title { get; }
string Color { get; }
}
public interface I2DShape : IShape
{
int GetArea();
}
public interface I3DShape : IShape
{
int GetVolume();
}
Затем можно реализовать I2DShape
в Circle
и Rectangle
, а также I3DShape
в Cube
. Ваш метод может быть реализован так:
public void ShapeClicked(IShape shape)
{
var shape2d = shape as I2DShape;
if(shape2d != null)
{
shape2d.GetArea();
return;
}
var shape3d = shape as I3DShape;
if(shape3d != null)
{
shape3d.GetVolume();
}
}
Вам все еще нужно проверить, является ли форма 2D или 3D, но это только потому, что мы определили Площадь и Объем как отдельные вещи. Если вы хотите определить их как единичную вещь, вы можете поместить это в базовый интерфейс и сделать так, чтобы все ваши типы реализовывали этот интерфейс.