Интерфейс, здесь означающий конструкцию кода, а не абстракцию дизайна, поддерживает основной принцип разработки кода, называемый «свободная связь». Есть еще несколько основополагающих принципов, которые говорят о том, что код HOW должен быть слабо связан, но в основном, свободная связь помогает разрешить изменения кода влиять на как можно меньшую площадь кодовой базы.
Рассмотрим, например, расчет какой-либо произвольной сложности. Этот расчет используется 6 различными классами, поэтому, чтобы избежать дублирования кода, вычисление инкапсулируется в собственный класс Calculator. Каждый из 6 классов содержит ссылку на калькулятор. Теперь скажите, что ваш клиент приходит к вам и говорит, что при одном использовании калькулятора, если выполняются определенные условия, вместо этого следует использовать другой расчет. У вас может возникнуть соблазн просто поместить эти два правила (правило использования и бизнес-правило) и новый алгоритм вычисления в класс калькулятора, но если вы это сделаете, произойдет две вещи; во-первых, вы делаете Калькулятор осведомленным о некоторых деталях реализации (как это используется) за пределами своей сферы действия, что ему не нужно знать, и это может измениться позже.Во-вторых, остальные 5 классов, которые используют Калькулятор, которые работают очень хорошо как есть, должны быть перекомпилированы, поскольку они ссылаются на измененный класс и должны быть протестированы, чтобы гарантировать, что вы не нарушили их функциональность, изменив одно для 6-го класса.
«Правильное» решение для этого - интерфейс. Определив интерфейс ICalculator, который предоставляет метод (ы), вызываемый другими классами, вы разбиваете конкретную зависимость 6 классов от конкретного класса Calculator. Теперь каждый из 6 классов может иметь ссылку на ICalculator. На 5 из этих классов вы предоставляете тот же класс калькулятора, который у них всегда был, и с ним все отлично. 6-го, вы предоставляете специальный калькулятор, который знает дополнительные правила. Если бы вы сделали это с самого начала, вам не пришлось бы трогать другие 5 классов, чтобы внести изменения в 6-й.
Основной момент состоит в том, что классы не должны знать точный характер других объектов, от которых они зависят; вместо этого они должны знать только, что для них сделает этот объект. Абстрагируя то, что делает объект из того, что объект IS, несколько объектов могут делать подобные вещи, а классы, которые требуют этих вещей, не должны знать разницу.
Свободная муфта, наряду с «высокой связью» (объекты обычно должны быть специалистами, которые знают, как выполнять небольшой, очень важный набор задач), является основой для большинства шаблонов проектирования программного обеспечения, которые вы увидите так как вы переходите к теории разработки программного обеспечения.
В отличие от нескольких ответов, существуют методологии проектирования (например, SOLID), в которых говорится, что вы должны ВСЕГДА настраивать зависимости как абстракции, такие как абстрактный базовый класс или интерфейс, и НИКОГДА не должны иметь один класс от другого конкретного класс. Логика здесь заключается в том, что в разработке коммерческого программного обеспечения первоначальный набор требований к приложению очень мал, но это безопасное предположение, если не гарантия, что набор требований будет расти и изменяться. Когда это произойдет, программное обеспечение должно расти. Создание даже небольших приложений в соответствии со строгими принципами проектирования позволяет распространять программное обеспечение, не вызывая проблем, которые являются естественным следствием плохого дизайна (большие классы с большим количеством кода, изменения одного класса, влияющие на других непредсказуемым образом и т. Д.). Однако искусство разработки программного обеспечения и ограничения времени и денег таковы, что вы можете (и должны) быть умными и говорить «из того, что я знаю о том, как эта система будет расти», это область, которая нуждается в чтобы быть хорошо разработанными для адаптации, в то время как этот другой раздел почти наверняка никогда не изменится ». Если эти предположения изменяются, вы можете вернуться назад и перестроить области кода, которые вы разработали, просто чтобы быть более надежными, прежде чем расширять эту область. Но вы должны быть готовы и в состоянии вернуться и изменить код после его первого внедрения.
Что такое «интерфейс класса»? Классы и интерфейсы - это разные вещи на C#. – Oded
@Oded: Моя формулировка может быть слегка отключена, но я имею в виду, что интерфейсы привязаны к классу, и я не знал, как правильно это обозначать. – Signal101
Что значит мой «интерфейс класса». В классах C# и интерфейсах разные, но связанные вещи. –