Страницы

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

воскресенье, 8 марта 2020 г.

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

#cpp #ооп #интерфейс


Как известно, отдельных языковых средств для объявления интерфейсов в С++, а их роль
могут выполнять абстрактные классы.
Но с идеологической точки зрения интерфейсы и абстрактные классы являются довольно
разными сущностями. Интерфейсы описывают некий контракт того, как можно взаимодействовать
с классом. Абстрактные классы являются корнем иерархии классов, используются для полиморфизма
в духе 

AbstractSuperClass* a = new SubClass;


и могут просто реализовывать общий функционал. 

Нужно ли, программируя на С++, разделять эти понятия и писать интерфейсы, как в Java/C#?
Или можно(нужно?) смешивать и использовать только абстрактные классы?  
    


Ответы

Ответ 1



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

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

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