Как я узнаю, когда создавать интерфейс? - PullRequest
188 голосов
/ 14 января 2009

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

Я часто читаю о них, но мне кажется, что я не могу их понять.

Я читал примеры, такие как: базовый класс Animal, с интерфейсом IAnimal для таких вещей, как 'Walk', 'Run', 'GetLegs' и т. Д., Но я никогда не работал над чем-то и чувствовал, что "Эй, я должен используйте интерфейс здесь! "

Чего мне не хватает? Почему мне так сложно понять это? Меня просто пугает тот факт, что я, возможно, никогда не осознаю конкретной потребности в ней - в основном из-за какого-то недостающего аспекта их понимания! Это заставляет меня чувствовать, что я что-то упускаю из-за того, что являюсь разработчиком! Если у кого-то был подобный опыт, и у него был прорыв, я был бы признателен за несколько советов о том, как понять эту концепцию. Спасибо.

Ответы [ 24 ]

1 голос
/ 14 января 2009

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

1 голос
/ 24 июня 2009

Существует множество целей использования интерфейса.

  1. Использование в полиморфном поведении. Где вы хотите вызывать определенные методы дочернего класса с интерфейсом, имеющим ссылку на дочерний класс.

  2. Наличие контракта с классами для реализации всех методов там, где это необходимо, как наиболее распространенное использование с объектами COM, где класс-оболочка генерируется в DLL, которая наследует интерфейс; эти методы вызываются за кулисами, и вам просто нужно реализовать их, но с той же структурой, как определено в COM DLL, которую вы можете узнать только через интерфейс, который они предоставляют.

  3. Чтобы уменьшить использование памяти путем загрузки определенных методов в классе. Например, если у вас есть три бизнес-объекта и они реализованы в одном классе, вы можете использовать три интерфейса.

Например, IUser, IOrder, IOrderItem

public interface IUser()
{

void AddUser(string name ,string fname);

}

// Same for IOrder and IOrderItem
//


public class  BusinessLayer: IUser, IOrder, IOrderItem

{    
    public void AddUser(string name ,string fname)
    {
        // Do stuffs here.
    }

    // All methods from all interfaces must be implemented.

}

Если вы хотите добавить только пользователя, сделайте так:

IUser user = new (IUser)BusinessLayer();

// It will load  all methods into memory which are declared in the IUser interface.

user.AddUser();
1 голос
/ 14 января 2009

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

Здесь, как обычно, есть компромисс: гибкость по сравнению с ремонтопригодностью. Какой из них важнее? Там нет ответов - это зависит от проекта. Но просто помните, что каждое программное обеспечение должно быть поддержано ...

Так что мой совет: не используйте интерфейсы, пока они вам действительно не понадобятся. (С помощью Visual Studio вы можете извлечь интерфейс из существующего класса за 2 секунды, поэтому не спешите.)

Сказав это, когда вам нужно создать интерфейс?

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

И это работает: о)

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

PS: когда я пишу «интерфейс», я имею в виду: «интерфейс любого базового класса», включая чистые классы интерфейса. Обратите внимание, что абстрактные классы часто лучше, чем чистые интерфейсы, поскольку вы можете добавить к ним логику.

С уважением, Сильвен.

1 голос
/ 14 января 2009

Поскольку несколько человек, вероятно, уже ответили, интерфейсы могут быть использованы для обеспечения определенного поведения между классами, которые не будут реализовывать эти поведения таким же образом. Итак, реализуя интерфейс, вы говорите, что ваш класс имеет поведение интерфейса. Интерфейс IAnimal не был бы типичным интерфейсом, потому что классы Dog, Cat, Bird и т. Д. Являются типами животных и, вероятно, должны расширять его, что является случаем наследования. Вместо этого интерфейс в этом случае будет больше похож на поведение животных, например, IRunnable, IFlyable, ITrainable и т. Д.

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

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

Я бы рекомендовал прочитать главу об интерфейсах в Java Design от Coad, Mayfield и Kern. Они объясняют это немного лучше, чем обычный вводный текст. Если вы не используете Java, вы можете просто прочитать начало главы, которая в основном представляет собой концепции.

...