защищенный член ifstream

Я близок к завершению своего первого проекта ООП, исходящего из C. Мне была интересна проблема дизайна, связанная с некоторым объектом ifstream, который я использую в базовом классе для открытия файла. После этого я хотел бы использовать тот же поток для дальнейшей работы с производными классами. Я определил только этот член как защищенный, чтобы я мог достичь того, что в производных классах защищенный нарушает инкапсуляцию (я хотел бы заработать хорошие привычки), должен ли я определить какую-то функцию-геттер для возврата ссылки на объект потока? Поскольку объекты ifstream не копируются, это может быть проблемой, первое, что я вижу...

Бест, Умут


person Umut Tabak    schedule 02.12.2010    source источник


Ответы (1)


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

Инкапсуляция не означает, что все должно быть private, это означает, что каждый элемент данных или кода данного класса виден только минимальному набору пользователей класса для достижения предназначенной для класса цели. Другими словами, не делайте все public только потому, что это упрощает программирование.

Вам понадобится геттер public только в том случае, если вы хотите предоставить функцию ввода-вывода базового и производного классов для кода вне иерархии. Между прочим, возврат ссылки не подразумевает никакого копирования.

person Steve Townsend    schedule 02.12.2010
comment
И Getter еще больше нарушает инкапсуляцию (если она общедоступна) - person Drakosha; 02.12.2010
comment
Спасибо, Стив, не могли бы вы сделать это? Вам понадобится общедоступный геттер только в том случае, если вы хотите предоставить функцию ввода-вывода базового и производных классов для кода вне иерархии, немного ясного, возможно, короткого примера. - person Umut Tabak; 02.12.2010
comment
@Drakosha - это чисто оценочное суждение, нельзя быть уверенным, что это Плохая вещь, не зная больше о цели класса. - person Steve Townsend; 02.12.2010
comment
@Umut - вы уже постулировали геттер как способ доступа производных классов к потоку. Это сработает, но член данных protected (вероятно) в порядке и проще. Если непроизводные классы должны обращаться к потоку напрямую (и это может быть не очень хорошей идеей, как отметил @Drakosha), вы можете реализовать геттер public. - person Steve Townsend; 02.12.2010
comment
@ Стив Таунсенд: я имею в виду, что публичный геттер почти так же плох, как и публичный член в нарушении инкапсуляции, вы не согласны? - person Drakosha; 02.12.2010
comment
Да, если вы делаете что-то публичным, то неважно, как. Публичный геттер в некотором смысле хуже, потому что он позволяет вашему коду казаться несвязанным (используя результат геттера), а на самом деле таковым не является. - person Steve Townsend; 02.12.2010