Подтвердить что ты не робот

Почему мы реализуем интерфейсы?

Почему мы реализуем, например, ICloneable или IDisposable. Я не спрашиваю, что делают ICloneable или IDisposable, но я хочу узнать, что является хорошей причиной для реализации этих интерфейсов, а не просто для написания метода, который располагает или клонирует наши объекты?

4b9b3361

Ответ 1

Использование интерфейсов обеспечивает постоянство использования этих компонентов. Таким образом, когда другой класс хочет/должен использовать ваш класс, он может действовать на нем как клонируемый, одноразовый объект, не беспокоясь о ваших конкретных деталях реализации.

Ответ 2

Используя хорошо известный интерфейс, вы можете иметь полиморфизм, который позволяет писать общий код, который может действовать на любой экземпляр класса, реализующего данный интерфейс.

Вы можете проверить статью Википедии о полиморфизме для более подробной информации.

Ответ 3

Потому что вы можете использовать тот же код для экземпляров разных классов. Например, процедура очистки формы хочет перебрать все компоненты и уничтожить их. Чтобы это сделать, необходимо обратиться к компонентам через тип: либо общий базовый класс, либо интерфейс. Единственное наследование означает, что общий базовый класс не всегда возможен (предположим, что моя форма имеет как FileStream, так и Button), какой общий базовый класс мог бы иметь, чтобы подпрограмма очистки могла получить к ним доступ?); следовательно, интерфейсы.

Ответ 4

Добавляя к большей мудрости интерфейса, интерфейсы могут использоваться как контракты между потребительским кодом и кодом обслуживания. Вместо того, чтобы говорить, что это объект, с которым мы будем иметь дело, с интерфейсами, которые есть в соглашении, так выглядит объект, который я возвращаю. В коде это может быть что-то вроде:

код службы

public IEnumerable<int> GetNumbers(){ return new []{1,2,3,4,5}; }

клиентский код:

var result = serviceProxy.GetNumbers();

Здесь код службы может изменить реализацию, чтобы вернуть любой класс, который удовлетворяет IEnumerable, без нарушения кода клиента.

Помимо всего этого, у вас есть другие приложения, такие как IoC DI, Unit Testing, Object Mocking. Все это принесет пользу полиморфной доброте.

Ответ 5

Среди других причин читайте о блоке using.

Ответ 6

Феб дал отличный ответ, но добавил немного больше.

Это заставляет вас писать методы, которые ожидаются для клонирования или создания того, что может быть удалено. Если бы вам пришлось писать только этот метод, всегда ли вы включали бы все необходимые методы или подпись всегда была бы одинаковой?

Если есть новая структура и они что-то добавляют, чтобы гарантировать правильность выполнения операций, используя интерфейсы, это заставляет вас внедрять любые новые изменения, так как ваше приложение больше не будет компилироваться.

Ответ 7

В итоге интерфейс разделяет реализацию и определяет структуру, и эта концепция очень полезна в тех случаях, когда требуется, чтобы реализация была взаимозаменяемой. Кроме того, интерфейс очень полезен, когда реализация меняется часто.

Интерфейс может использоваться для определения общего шаблона, а затем одного или нескольких абстрактных классов для определения частичных реализаций интерфейса.

Интерфейсы просто указывают объявление метода (неявно публичное и абстрактное) и могут содержать свойства (которые также неявно публичны и абстрактны). Определение интерфейса начинается с интерфейса ключевого слова. Интерфейс, подобный абстрактному классу, не может быть создан.

Ответ 8

Интерфейс отделяет то, что сделано от того, как это делается. Клиенты имеют дело с типом интерфейса, не зная, что такое класс реализации, потому что они могут полагаться на контракт, который он применяет.

Это важно для ситуаций, которые генерируют динамические прокси. Клиенты не должны знать, что они имеют дело с прокси-сервером, что дает вам свободу вводить любое поведение, в котором вы нуждаетесь. Это общий метод аспектно-ориентированного программирования.