Существует два способа выбора между абстрактным классом или интерфейсом. Решение Microsoft и решение Oracle:
Microsoft, руководство по проектированию:
Используйте абстрактные (MustInherit в Visual Basic) классы вместо интерфейсов, чтобы отделить контракт от реализаций.
http://msdn.microsoft.com/en-us/library/ms229013.aspx
Oracle, The Java Tutorials:
Если абстрактный класс содержит только объявления абстрактных методов, вместо этого он должен быть объявлен как интерфейс.
http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Мой вопрос в том, какой способ правильный? Решение Microsoft или Oracle? Обратите внимание, что я думаю, что выбор между абстрактным классом или интерфейсом не должен зависеть от языка программирования (Java или C#).