Необходимость различать интерфейс и класс на самом деле указывает на недостаток дизайна. В хорошо разработанном приложении это всегда будет понятно. Подкласс всегда должен быть специализацией, а классы могут специализироваться только на одном предмете, но не более.
У класса должна быть одна причина существования. Никогда не требуется размещать второстепенные роли в базовом классе. E.g.:
public class XmlConfigurationFile : ConfigurationFile, IDisposable
{
}
public class YamlConfigurationFile : ConfigurationFile, IDisposable
{
}
Первый - это файл конфигурации, специализирующийся на Xml, второй - на Yaml. Они также одноразовые, но это не так важно. Вы не создали эти два класса из-за разных процессов утилизации.
Сравните это с:
public class XmlConfigurationFile : IDisposable, ConfigurationFile
{
}
Это скажет вам, что основная цель XmlConfigurationFile состоит в том, что он одноразовый. То, что вы можете использовать его как способ представления файлов конфигурации, это хорошо, но вторично.
Проблема начинается, когда вы создаете классы с несколькими причинами существования:
public class MyConfigurationFile : XmlConfigurationFile, YamlConfigurationFile
{
}
Даже если XmlConfigurationFile и YamlConfigurationFile были бы интерфейсами, это все равно указывает на плохой дизайн. Как ваш файл конфигурации может быть одновременно Xml и Yaml?
Если вы прочитаете приведенные примеры (здесь и в других местах), люди всегда изо всех сил пытаются найти хороший пример того, когда I-префикс имеет значение. Один из ответов здесь:
public class Dog : Pet, Mammal
{
}
Так будет выглядеть этот класс в приложении о домашних животных. Основная цель собаки - быть специализированным домашним животным, которое может делать связанные с домашним животным вещи, а не то, что это млекопитающее.
public class Dog : Mammal, Pet
{
}
Так будет выглядеть тот же класс в приложении о классификации животных. Приятно знать, что собака - это домашнее животное, но его главная цель - быть специализированным млекопитающим, которое может делать вещи, связанные с млекопитающими.
Я думаю, что ваши классы должны рассказать вам правильную историю об архитектуре и области вашего приложения. Требование к интерфейсу иметь префикс «I» является техническим требованием и не поможет вам лучше рассказать историю вашего приложения.
Как только вы начнете писать небольшие, специализированные, одноцелевые классы, необходимость знать, реализует ли он или расширяется, автоматически исчезнет.