Для вопроса 1: независимо от поддержки нескольких интерфейсов наследования являются спецификациями контракта, абстрактные классы являются базовыми классами.
Интерфейсы предоставляют классу возможность указать набор возможностей (например, IDisposable, IEnumerable и т. Д.), И рекомендуется, чтобы они подчинялись Принципу разделения интерфейсов .
Абстрактные классы должны реализовывать концепцию, которая может быть расширена или может иметь разные реализации в зависимости от контекста (например, HttpContextBase , AbstractButton и т. Д.).
Самое большое различие между интерфейсами и абстрактными классамиконцептуальный.Вы можете утверждать, что, кроме наследования, интерфейс - это то же самое, что абстрактный класс с только абстрактными методами, но концептуально они представляют разные вещи.
Что касается вопроса 2: в контексте интерфейсов DDD приводятся подробности реализации.Смею сказать, что вы можете использовать DDD и не использовать интерфейсы, абстрактные классы или даже наследование.Пока у вас есть четко определенные ограниченные контексты, агрегаты, сущности и VO.
В заключение, когда вы пытаетесь выразить контракт, используйте интерфейс, когда вы хотите указать, что у вашего класса есть некоторые возможности, реализуйте интерфейс.Если у вас есть концепция, для которой вы можете предоставить больше реализаций в зависимости от контекста, используйте базовый класс (абстрактный или нет).
Когда вы думаете об этом таким образом, решение создателей языка (c #)разрешить только одно наследование, но разрешить реализацию нескольких интерфейсов имеет большой смысл.