Интерфейсы против абстрактных classов

В C #, когда вы должны использовать интерфейсы и когда следует использовать абстрактные classы? Что может быть решающим фактором?

Преимущества абстрактного classа:

  • Возможность указывать стандартные реализации методов
  • Добавлена ​​инвариантная проверка функций
  • Чуть больше контроля над тем, как называются методы «интерфейса»
  • Возможность предоставлять поведение, связанное или не связанное с интерфейсом для «свободного»

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

Абстрактные classы и интерфейсы семантически различны, хотя их использование может перекрываться.

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

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

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

Реальный вопрос: использовать интерфейсы или базовые classы. Это было рассмотрено ранее.

В C # абстрактный class (один с ключевым словом «abstract») – это просто class, из которого вы не можете создавать объекты. Это служит другой цели, чем просто провести различие между базовыми classами и интерфейсами.

  • Когда мне нужно использовать интерфейсы вместо абстрактных classов?
  • шаблоны: переменные-члены родительского classа не видны в унаследованном classе
  • C # - создание всех производных classов вызывает конструктор базового classа
  • Ошибка Java: неявный супер-конструктор не определен для конструктора по умолчанию
  • Почему оба родительского и дочернего classов реализуют один и тот же интерфейс?
  • Зачем использовать наследование вообще?
  • Могу ли я переопределить свойство в c #? Как?
  • Почему не наследовать от List ?
  • Поведение статических блоков с наследованием
  • Почему метод classа C #, реализованный в classе, должен быть общедоступным?
  • Можно ли вызвать методы подclassов над объектом суперclassа?
  • Давайте будем гением компьютера.