2009-10-18 6 views
13

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

ответ

20

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

+2

Иногда я думал об одном и том же, но я был не совсем уверен, потому что было что-то еще, Но я был прав на мою мысль :) Большое спасибо. – Tarik

2

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

+0

Я думаю, что он используется для удаления объектов без ссылок. Но я не просил этого: хорошо спасибо за ваше время :) – Tarik

5

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

10

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

Вы можете проверить Wikipedia article on polymorphism для получения дополнительной информации.

2

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

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

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

2

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

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

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

3

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

код услуги

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

код клиента:

var result = serviceProxy.GetNumbers(); 

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

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

2

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

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

Смежные вопросы