2012-02-26 5 views
6

Можно создать дубликат:
Interfaces: Why can't I seem to grasp them?
Why would I want to use Interfaces?Зачем мне нужен интерфейс?

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

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

--Thx заранее.

Примечание: Я задаю этот вопрос в контексте .NET (C#) язык

Edit1: На данный момент, когда я пытаюсь узнать интерфейс мой разум говорит мне -> «приятель вы собираетесь очертите чье-то тело в белом листе «Но вам нужен еще один белый лист, где вам нужно снова нарисовать контур, нарисуйте все части тела, чтобы заполнить их цветами, чтобы получить реальную картину». Так почему я трачу первый белый лист, чтобы получить наброски

+0

Это может помочь: интерфейсы описывают * периферийные * атрибуты, абстрактные классы определяют * основные * функции. – Jason

+0

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

+0

Есть десятки потенциальных дубликатов этого вопроса ... вот несколько: [1 ] (http://stackoverflow.com/questions/240152/why-would-i-want-to-use-interfaces), [2] (http://stackoverflow.com/questions/3355408/explaining-interfaces-to -студиенты), [3] (http://stackoverflow.com/questions/122883/interfaces-why-cant-i-seem-to-grasp-them) –

ответ

12

Самый простой способ понять интерфейсы состоит в том, что они позволяют различным объектам раскрывать ОБЩИЕ функциональные возможности. Это позволяет программисту писать гораздо более простой, более короткий код, который программирует интерфейс, а затем, пока объекты реализуют этот интерфейс, он будет работать.

базы данных Провайдеры:

Есть много различных поставщиков баз данных, MySQL, MSSQL, Oracle и т.д. Однако все объекты базы данных могут сделать то же самое, так что вы найдете множество интерфейсов для объектов базы данных. Если объект реализует IDBConnection, он предоставляет методы Open() и Close(). Поэтому, если я хочу, чтобы моя программа была агностикой базы данных, я программирую интерфейс, а не конкретным провайдерам.

IDbConnection connection = GetDatabaseConnectionFromConfig() 
connection.Open() 
// do stuff 
connection.Close() 

См путем программирования к интерфейсу (IDbConnection) теперь я могу выгрузить любой поставщик данных в моей конфигурации, но мой код остается точно такой же. Эта гибкость может быть чрезвычайно полезна и удобна в обслуживании. Недостатком этого является то, что я могу выполнять только «общие» операции с базой данных и не могу полностью использовать силу, которую предлагает каждый конкретный провайдер, так как со всем в программировании у вас есть компромисс, и вы должны определить, какой сценарий вам больше всего пригодится.

Коллекции:

Если вы заметили, почти все коллекции реализуют этот интерфейс под названием IEnumerable. IEnumerable возвращает IEnumerator, который имеет MoveNext(), Current и Reset(). Это позволяет C# легко перемещаться по вашей коллекции. Причина, по которой он может это сделать, заключается в том, что он предоставляет интерфейс IEnumerable, который ЗНАЕТ, что объект предоставляет методы, необходимые для его прохождения. Это делает две вещи. 1) петли foreach теперь будут знать, как перечислить коллекцию, и 2) теперь вы можете применить мощные выражения LINQ к своей коллекции. Опять же, почему интерфейсы настолько полезны здесь, потому что все коллекции имеют что-то в COMMON, их можно перемещать. Каждая коллекция может перемещаться по-другому (связанный список против массива), но красота интерфейсов заключается в том, что реализация скрыта и не имеет отношения к потребителю интерфейса. MoveNext() дает вам следующий элемент в коллекции, это не имеет значения, КАК он это делает. Довольно приятно, да?

полиморфизм

Когда вы разрабатываете свои собственные интерфейсы, вы просто должны задать себе один вопрос. Что общего у этих вещей? Когда вы найдете все, что разделяет объекты, вы абстрагируете эти свойства/методы в интерфейсе, чтобы каждый объект мог наследовать его. Затем вы можете запрограммировать несколько объектов с использованием одного интерфейса.

И, конечно, я должен привести свой любимый полиморфный пример C++, пример животных. Все животные имеют определенные характеристики. Допустим, они могут двигаться, говорить, и все они имеют имя. Поскольку я только что определил, что общего у всех моих животных, и я могу абстрагировать эти качества в интерфейсе IAnimal. Затем я создаю объект Bear, объект Owl и объект Snake, реализующий этот интерфейс.Причина, по которой вы можете хранить разные объекты вместе, реализующие один и тот же интерфейс, состоит в том, что интерфейсы представляют собой повторную передачу IS-A. Медведь IS-A животное, сова IS-A животное, поэтому он делает, так как я могу собрать их всех как Животных.

var animals = new IAnimal[] = {new Bear(), new Owl(), new Snake()} // here I can collect different objects in a single collection because they inherit from the same interface 

foreach (IAnimal animal in animals) 
{ 
    Console.WriteLine(animal.Name) 
    animal.Speak() // a bear growls, a owl hoots, and a snake hisses 
    animal.Move() // bear runs, owl flys, snake slithers 
} 

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

Итак, самое главное с интерфейсами - это то, что объединяет объекты, чтобы вы могли программировать против РАЗНЫХ объектов по ИСПОЛЬЗУЕМОЙ дороге. Экономит время, создает более гибкие приложения, скрывает сложность/реализацию, моделирует объекты/ситуации в реальном мире, среди многих других преимуществ.

Надеюсь, это поможет.

+2

Отличный ответ. –

+0

Одно из лучших объяснений обоснования использования интерфейса. – rajibdotnet

+0

Закладка этого ответа. +1. – Jogi

6

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

Абстрактный класс - это шаблон для поведения класса, вы можете заполнить только один шаблон для каждого класса.

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

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

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

EDIT: Рассмотрим это:

У вас есть приложение, которое нужно хранить некоторые данные Say EntityA но вы можете иметь несколько способов, в которых можно хранить данные (например, XML, базы данных SQL, CSV т.д.). Вы можете создать класс для каждого из этих разных методов для хранения EntityA. но когда вы хотите изменить метод, вам нужно явно указать тип, который вы хотите прямо там.

т.е.

public class DoStuffWithEntityA{ 
    public void DoStuffAndStoreAsXml(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreAsCsv(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreInDatabase(EntityA entity){ /*Logic*/} 
} 

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

например

public interface IStoreEntityA{ 
    void Store(EnitityA entity); 
} 

тогда вы могли бы просто сказать, что вы хотите что-то, что хранит EntityA в коде

public class DoStuffWithEntityA{ 
    private IStoreEntityA _entityAStorer; 
    public DoStuffWithEntityA(IStoreEntityA howIStoreEntityA){ _entityAStorer = howIStoreEntityA;} 
    public void DoStuff(EntityA entity) 
    { 
     //Do Stuff 
     _entityAStorer.Store(entity); 
    } 
} 

Это означает, что ваша логика разве тесно связаны с тем, как вы храните EntityA

+0

Спасибо за ваш ответ. Но если вы прочитаете мое новое редактирование, вы поймете, что происходит в моем сознании. Это будет полезно, если вы дадите мне пример. Thx –

+0

См. Мои изменения для сценария здесь, в основном иногда вы можете не хотеть/не знать, как что-то реализовано, поэтому вы просто просите все, что соответствует конкретному контракту. –