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