Альтернатива - не указывать интерфейс в объявлении базовых классов. Каждый производный класс должен перечислить ICanvasTool в своем объявлении, если он хочет реализовать интерфейс, а затем он несет полную ответственность за реализацию остальной части интерфейса. Единственный недостаток, который я вижу, это то, что вы не можете явно реализовать методы интерфейса в базовом классе (т.е. без ICanvasTool: Motion), но в противном случае это довольно низкая версия служебной информации.
public interface ICanvasTool
{
void Motion(Point newLocation);
void Tick();
}
public abstract class CanvasTool_BaseDraw
{
public void Motion(Point newLocation)
{
//some implementation
}
}
public class CanvasTool_Spray : CanvasTool_BaseDraw, ICanvasTool
{
public void Tick()
{
//some implementation
}
}
Примечание: я пропустил PaintAt, потому что в этом не было необходимости.