2010-05-15 2 views
0

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

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

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

+0

Как насчет 'a-> c.setBlah()'? – hanno

ответ

2

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

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

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

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

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

+1

Я бы сказал, что решение должно в основном зависеть от того, является ли 'C' внутренним типом детали (используйте' A :: setBlah() ') или какой-то открытый интерфейс (используйте' a.getC(). setBlah() '). Конечно, это несколько нечеткая концепция, если вы не пишете библиотеку, так как часто это не проблема, чтобы сделать внутренние детали публичным интерфейсом или наоборот в этом случае. – doublep

+0

Спасибо! Я подумаю об этом :) – Klaus

1

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

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

1

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

+1

Как насчет 'C & getC()'? – doublep

+0

Да, конечно же, спасибо :) – Klaus