Инкапсуляция (скрытие информации) является очень полезной концепцией, гарантирующей, что в API класса будут опубликованы только самые минимальные детали.Как вы делаете «истинную» инкапсуляцию в C++?
Но я не могу не думать о том, что способ C++ делает это немного недостаточным. Возьмем, к примеру, (по Цельсию на основе) Температурный класс как:
class tTemp {
private:
double temp;
double tempF (double);
public:
tTemp();
~tTemp();
setTemp (double);
double getTemp();
double getTempF();
};
Теперь, это очень простой случай, но он иллюстрирует точку, что инкапсуляция не является совершенным. «Реал» инкапсуляция бы скрыть все ненужной информации, такой как:
- тот факт, что данные сохраняются внутри в
temp
переменной (и его тип). - факт, что существует внутренняя процедура преобразования Фаренгейта/Цельсия.
Так что, в идеале, мне кажется, что разработчик класса использовал бы упомянутый выше заголовок, но любой клиент этого класса увидит только публичные биты.
Не поймите меня неправильно, я не критикую C++, так как он соответствует заявленной цели предотвращения клиентов от с использованием частных битов, но для более сложных классов вы можете легко разработать внутренние детали на основе имена, типы и подписи частных данных и функций.
Как C++ позволить разработчикам, чтобы скрыть эту информацию (предполагается, что is Возможно)? В C я просто использовал непрозрачный тип, чтобы внутренние детали были скрыты, но как бы вы это сделали на C++?
Я полагаю, я мог бы поддерживать отдельный класс, полностью скрытый от клиента и известен только мой собственный код, а затем сохранить его экземпляр с void *
в видимом классе (литье в моем коде), но это кажется довольно болезненным процессом. Есть ли более простой способ в C++ достичь той же цели?
Не могу дождаться, пока модули разобрались :) – chris
Кто-то уже упоминал Pimpl, о котором вы более или менее косвенно упоминаете, но с большей безопасностью, чем void *. Другой подход заключается в объявлении класса интерфейса (сигнатуры являются чисто виртуальными) и фабрики, которая является единственной, которая посвящена внутренней работе конкретных производных классов. –
То, что вы называете «истинным» инкапсуляцией, возможно * на C++, поскольку многие ответы * pimpl * подтверждают, но это связано с затратами. Скрытие внутренних компонентов от * пользователей * хорошо и хорошо, но их скрытие от компилятора * блокирует оптимизацию. Это основная цель C++, которую производительность выигрывает, когда есть конфликт между производительностью и некоторыми другими функциями. – Casey