Интерфейсы можно рассматривать как контракт, который должен выполняться любым реализующим классом.Используйте его, если хотите гарантировать, что все классы делают одно и то же - удовлетворяют одному и тому же API - но вам все равно, как они это делают. Если свойства являются частью этого API, то обязательно включите их в ваш интерфейс .
Из приведенного выше примера, если вы хотите, чтобы все автомобили имели гарантированную , имели цвет и minSpeed, тогда эти свойства принадлежат интерфейсу.Если эти свойства относятся только к BMW, то они принадлежат к классу BMW.Если эти свойства принадлежат некоторым классам, но не другим, вы можете создать новый интерфейс, расширяющий исходный:
public interface IVehicleWithColorAndMinSpeed : IVehicle
{
string Color { get; set; }
int MinSpeed { get; set; }
}
(только не увлекайтесь этим)
Абстрактные классы похожи, но позволяют вам обеспечить реализацию по умолчанию для ваших подклассов.
Абстрактные классы, как правило, проще в версии, поскольку вы можете добавить что-то новое в свой API и предоставить реализацию по умолчанию, которую ваши существующие подклассы будут автоматически выбирать;добавление чего-либо в интерфейс немедленно разрушает все существующие классы, которые реализуют этот интерфейс.