Я думаю, что лучший способ взглянуть на интерфейс:
msgstr "список сервисов, которые будут предоставлены классом, реализующим этот интерфейс".
Примером может быть ISwitchable, все классы, которые реализуют этот интерфейс, предоставляют способ (определенный в интерфейсе) для переключения. Реализация ISwitchable может быть кнопкой.
С другой стороны, отношение база / подкласс может быть описано как:
Подкласс - это специализация базового класса.
Таким образом, если у вас есть домашнее животное в качестве базового класса, вы можете иметь собаку, выведенную из базы, так как это специализация домашнего животного. Вы не можете сказать, что собака предоставляет услуги домашних животных. В этом примере класс dog может реализовывать интерфейс IBrag.
Я не согласен с каким-то ответом, который говорит «когда» что-то должно быть интерфейсом или базовым классом. Это часть процесса моделирования, поэтому он зависит от бизнес-объектов и контекста, должен ли быть интерфейс или базовый класс.