Проблема действительно в том, что вы определили неопределенный интерфейс, контракт - более подходящий термин.Как будто вы заходите в McDonalds и просто заказываете гамбургер:
interface Resturant
{
Burger BuyBurger();
}
Человек, принимающий ваш заказ, некоторое время будет выглядеть немного растерянным, но в конечном итоге он / она подаст вам любой гамбургер, так как вы этого не сделаетеукажите, что вы хотите.
То же самое здесь.Вы действительно хотите определить, что что-то можно покрасить?Если вы спросите меня, это все равно что попросить неприятности.Всегда старайтесь сделать интерфейсы как можно более конкретными.Всегда лучше иметь несколько небольших специальных интерфейсов, чем большой общий.
Но давайте вернемся к вашему примеру.В вашем случае все классы должны только уметь что-то рисовать.Поэтому я бы добавил еще более конкретный интерфейс:
interface IPainter
{
void Paint(IPaintable paintable);
}
interface IDecalPainter : IPainter
{
void Paint(IDecalPaintable paintable);
}
interface IPaintable
{
void ApplyBaseLayer(Color c);
}
interface IDecalPaintable : IPaintable
{
void ApplyDecal(HatchBrush b);
}
class AwesomeDecalPainter : IDecalPainter
{
public void Paint(IPaintable paintable)
{
IDecalPaintable decalPaintable = paintable as IDecalPaintable;
if (decalPaintable != null)
Paint(decalPaintable);
else
paintable.ApplyBaseLayer(Color.Red);
}
public void Paint(IDecalPaintable paintable)
{
paintable.ApplyBaseLayer(Color.Red);
paintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green));
}
}
Я бы порекомендовал вам прочитать о принципах SOLID.
Обновление
Более реалистичная реализация интерфейса
interface IPaintingContext
{
//Should not be object. But my System.Drawing knowledge is limited
object DrawingSurface { get; set; }
}
interface IPaintable
{
void Draw(IPaintingContext context);
}
class AwesomeDecal : IPaintable
{
public void Draw(IPaintingContext paintable)
{
// draw decal
}
}
class ComplexPaintableObject : IPaintable
{
public ComplexPaintableObject(IEnumerable<IPaintable> paintable)
{
// add background, border
}
}
Здесь вы можете создавать как можно более сложные предметы рисования.Теперь они знают, что они рисуют, или какие другие краски могут быть использованы на той же поверхности.