Ограничение доступа к методам класса - PullRequest
1 голос
/ 21 января 2012

У меня есть класс A, который имеет открытые методы и используется 100 другими классами, реализованными в различных приложениях. Теперь я хочу сделать эти открытые методы приватными, чтобы новые классы к ним не обращались, но я хочу, чтобы существующие клиентские классы все еще имели к ним доступ. Но я не хочу даже касаться этих клиентских классов, потому что владельцы редко допускают даже волнение в своих классах.

Я проверил

Могу ли я получить доступ к закрытым членам вне класса, не используя друзей?

C ++: Есть ли способ ограничить доступ к определенным методам для определенных классов, не подвергая других закрытых членов?

класс друзей с ограниченным доступом

Но все (не все на самом деле) требуют изменения в коде клиента. Код клиента не должен меняться.

Один прямой путь - подружиться со всеми этими N классами, но мне это не совсем удобно. Есть ли какой-либо шаблон или приемлемый метод (не хак, пожалуйста) для достижения этого ограничения доступа? Спасибо, и я прошу прощения, если это дубликат.

Ответы [ 2 ]

1 голос
/ 21 января 2012

Классы в C ++ сделаны friend s, чтобы указать на особую намеренную сильную связь между классами.Такое использование friend infact улучшает инкапсуляцию, а не разрушает ее, как, возможно, популярное чувство.
Как?
Без дружбы единственным нехакерским способом раскрыть функциональность другому классу было бы предоставить publicФункции-члены get и set на самом деле нарушают инкапсуляцию, потому что все классы (даже те, кому это не нужно) теперь имеют доступ к этим методам и, следовательно, члены увеличивают риск потенциального нарушения данных классов.

Вернемся к вашей ситуации. Если у вас есть 100 классов, которым нужен доступ к этому конкретному классу, то у вас уже был правильный дизайн на месте, когда эти методы были public.Теперь попытка сделать эти методы private для будущих классов - это попытка взломать ваш существующий дизайн, ваш дизайн не поддерживает его.

Создание существующих классов как friend s не идеально вписывается в вышеупомянутые критерии и, следовательно, не является хорошим выбором для сценария.
Однако, учитывая ситуацию, нет другого пути, в которомВы можете реализовать это.Создание существующих классов как friend и предоставление им специального доступа кажется единственным способом.Это все еще плохо, потому что 100 классов, которые имели доступ только к нескольким методам, теперь будут иметь доступ ко всему вашему классу.

0 голосов
/ 21 января 2012

Я думаю, что вы можете извлечь интерфейс класса A (пусть это будет IA) и заставить A реализовать IA. Вы вообще не должны определять эти публичные методы в IA.

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

Конечно, это может быть неосуществимо, если вам нужно (скопировать) конструировать класс или что-то в этом роде, но я не могу сказать это сейчас, не зная об использовании класса.

Кроме того, вы получаете небольшие накладные расходы из-за virtual функций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...