Доступ к методам объекта, помещенного в класс - PullRequest
0 голосов
/ 16 мая 2010

Класс A обладает экземпляром c класса C. Другой класс B должен модифицировать метод от c до C::setBlah();.

Разве плохо создать аксессор C getC(); в A и затем использовать A.getC().setBlah()?

Или я должен создать метод A::setBlah();, который будет вызывать C::setBlah();? Разве это не раздражает, если есть несколько таких методов?

Ответы [ 3 ]

2 голосов
/ 16 мая 2010

Как с большинством "это плохо делать X?" вопросы, ответ заключается в том, что это полностью зависит от конкретной ситуации.

Иногда может быть очень плохой идеей иметь функцию getC(), потому что она нарушает инкапсуляцию. В других случаях это может быть совершенно нормально, потому что инкапсуляция этой детали может быть неактуальной, а написание большого количества функций-оболочек увеличивает объем кода, который вам нужно написать.

Выберите тот, который имеет наибольшее значение для данной ситуации. В коде, который я написал, я использовал оба подхода.

Если вы идете по маршруту getC(), обязательно верните ссылку; в противном случае вы будете изменять копию, которая не звучит так, как вы хотите. Или, возможно, вы захотите сделать A::c общедоступным, чтобы вообще не нуждаться в функции.

Третий вариант, который следует рассмотреть, это наследование от C, которое устраняет необходимость в getC() или функциях-оболочках в A.

1 голос
/ 16 мая 2010

Метод C getC(); создает копию c, поэтому вызов A.getC().setBlah() изменит копию c, а не c из A.

1 голос
/ 16 мая 2010

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

Такая установка также поднимает вопрос: почему B должен касаться члена A C? Может быть, ваш дизайн не совсем правильный - должен ли C быть членом B, а не A?

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