Сокрытие реализации путем предварительной декларации

У меня есть класс, назовем его Product, реализацию которого я хочу полностью скрыть от пользователя. Тем не менее, я хотел бы, чтобы пользователь собирал продукты, передавал их, в общем, решал, что с ними делать, не зная, что внутри.

Первой идеей, которая пришла мне в голову, было просто создать класс ProductFactory и объявить класс Product в заголовке ProductFactory.h.
Объект класса Product будет создан методом makeProduct, который будет возвращать общий указатель на класс Product. Тогда пользователь не сможет увидеть, что находится внутри, но он может, например, отправить его в класс Service, который в своей реализации будет включать полное определение Product, чтобы он мог получить доступ к своим внутренностям.
Как вы думаете, это хорошая идея или скорее обходной путь?

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

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

0

Решение

Если операции, которые вам предоставляет shared_ptr, являются достаточными для пользователя (например, должен быть оператор ==), тогда это решение должно быть способом решения проблемы.

Если вам нужно больше, чем это, то pimpl звучит как хороший способ, поскольку вы можете определить операции, которые нужны пользователю внутри вашего класса, и определить операции, которые нужны вашему классу Service, внутри impl. Вы все еще можете использовать умные указатели, чтобы облегчить жизнь.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]