Страницы

Поиск по вопросам

понедельник, 27 мая 2019 г.

Нужно ли разделять интерфейсы и абстрактные классы в С++

Как известно, отдельных языковых средств для объявления интерфейсов в С++, а их роль могут выполнять абстрактные классы. Но с идеологической точки зрения интерфейсы и абстрактные классы являются довольно разными сущностями. Интерфейсы описывают некий контракт того, как можно взаимодействовать с классом. Абстрактные классы являются корнем иерархии классов, используются для полиморфизма в духе
AbstractSuperClass* a = new SubClass;
и могут просто реализовывать общий функционал.
Нужно ли, программируя на С++, разделять эти понятия и писать интерфейсы, как в Java/C#? Или можно(нужно?) смешивать и использовать только абстрактные классы?


Ответ

В C#/Java нет множественного наследования классов, но есть множественное наследование интерфейсов. Поэтому в этих языках разделять интерфейсы и абстрактные классы приходится волей-неволей.
В С++ такого ограничения нет, поэтому нет особой надобности в выделении отдельного понятия "интерфейс", и отделения его от абстрактного класса. Интерфейсом может служить любой абстрактный класс, ему даже не обязательно иметь публичных виртуальных функций (ну, кроме деструктора, если нужно полиморфное удаление). Пример такого интерфейса - паттерн NVI
При желании более соответствовать ООП парадигме языков C#/Java можно давать интерфейсным классам имена, начинающиеся с буквы I, или даже добавить
#define interface struct
чтобы выделить интерфейсный класс при объявлении/определении. Такие подходы используются в MS COM.
Но в общем случае, этого не требуется, а проблему ромбовидной иерархии можно решить через виртуальное наследование.

Комментариев нет:

Отправить комментарий