Абстрактный класс или интерфейс, что и когда использовать

Абстрактные классы как и интерфейсы используются для одних целей. Как их применять при разработке в ABAP познакомимся в этой статье.

Что такое абстрактный класс?

Абстрактный класс это специальный вид класса который не может иметь инстанций. Мы можем лишь создать инстанции дочернего от него класса, если он так же не является абстрактным. Абстрактный класс должен содержать по крайней мере один абстрактный метод. Абстрактные методы имеют только объявление, они не должны иметь реализацию. Кроме того мы можем создать переменные типа абстрактного класса и присвоить им инстанцию дочернего класса во время выполнения.  Пример простого абстрактного класса:

Что такое интерфейс?

Во-первых интерфейс это не класс. Это сущность не имеющая реализации. Интерфейс может содержать только объявление методов и компонентов. Компоненты интерфейса всегда находятся в общедоступном разделе (public). Чтобы изменить их видимость в дальнейшем мы можем создать класс  на основе интерфейса. Пример простого интерфейса и класса его реализующего:

Основные отличия абстрактных классов от интерфейсов:

  • Множественное наследование. Мы можем использовать множественное наследование с помощью интерфейсов. ABAP не позволяет создавать класс на основе более чем одного супер класса, под супер классом имеется в виду абстрактный класс.
  • Функциональные возможности. Если мы добавим в интерфейс новый метод, все классы реализующие данный интерфейс так же должны определить этот метод, в противном случае возникнет ошибка. Для абстрактных классов если мы добавим новый не абстрактный метод, не будет необходимости его определения в наследуемых от него классах.
  • Поведение. Мы можем заранее задать определение для не абстрактных методов в абстрактном классе. Интерфейс такого не позволяет.
  • Видимость. Все компоненты интерфейса по умолчанию находятся в общедоступном разделе (public). В абстрактном классе мы можем сами задавать область видимости компонентов.

На основе данных особенностей можно определить следующие рекомендации:

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

Оригинал статьи.

  • интерфейс — определяет что должен уметь делать класс.
    Абстрактный класс — задаёт группу классов. И почему их всё время сравнивают это принципиально разные сущности.

  • mcloving

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

    • Alex_M_

      Формально — интерфейс частный случай абстрактного класса (как вы уже заметили, в C++ есть множественное наследование от классов). Что именно вы считаете костылями? 🙂
      Я сам давно абапер, но до сих пор считаю С++ более продуманным и элегантным языком, чем abap. Хотя в abap’е тоже есть свои прелести (RTTC, динамические Assign’ы и др.), которых нет в С++.

  • Alberd

    «т.к. некоторое го поведение» — подразумевалось слово «готовое»? 🙂