Являются ли интерфейсы избыточными, если в качестве интерфейса используются рефераты? - PullRequest
1 голос
/ 22 октября 2011

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

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

Резюме:

  • Вопрос 1: В контексте ООП с языком, который поддерживает только одиночное наследование, если он правильно спроектирован, каковы некоторые применения интерфейсов над абстрактным классом?
  • Вопрос 2: В контексте DDD, если он правильно спроектирован, каковы применения интерфейсов над абстрактным классом?

Примечание: Я прочитал все похожие вопросы, перечисленные, но ни один, кажется, не дает мне ответа.Если я пропустил один, пожалуйста, дайте мне знать.

Ответы [ 3 ]

3 голосов
/ 23 октября 2011

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

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

Абстрактные классы должны реализовывать концепцию, которая может быть расширена или может иметь разные реализации в зависимости от контекста (например, HttpContextBase , AbstractButton и т. Д.).

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

Что касается вопроса 2: в контексте интерфейсов DDD приводятся подробности реализации.Смею сказать, что вы можете использовать DDD и не использовать интерфейсы, абстрактные классы или даже наследование.Пока у вас есть четко определенные ограниченные контексты, агрегаты, сущности и VO.

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

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

1 голос
/ 22 октября 2011

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

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

1 голос
/ 22 октября 2011

Преимущество интерфейсов в том, что нет множественного наследования. Используя Интерфейс, вы можете разрешить таким классам, как Forms, UserControls, Components и т. Д., Участвовать во взаимодействиях, которые в противном случае были бы затруднены / невозможны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...