Кстати, интересная ситуация. Следует ли считать хаком получение доступа к Protected-элементу класса? Вряд ли, ведь если от него отнаследоваться, так и так все будет видно!
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Кстати, интересная ситуация. Следует ли считать хаком получение доступа к Protected-элементу класса? Вряд ли, ведь если от него отнаследоваться, так и так все будет видно!
Будет видно _изнутри_ класса-наследника. Хаком является получение доступа к protected-элементу из любого места кода, обеспечиваемая дружественностью.
С моей точки зрения, написав класс, я беру на себя ответственность за его поведение. То есть я могу написать наследника от TDBGrid, опубликовать в нем все, что считаю нужным, приписать своего кода — вопросов нет, я явно что-то делаю и отвечаю за это. Подобным же крэк-классом — хотя они, бесспорно, удобны — я лезу внутрь чужого класса из своего (не наследника), что имхо некорректно.
SM>>Кстати, интересная ситуация. Следует ли считать хаком получение доступа к Protected-элементу класса? Вряд ли, ведь если от него отнаследоваться, так и так все будет видно! S>Будет видно _изнутри_ класса-наследника. Хаком является получение доступа к protected-элементу из любого места кода, обеспечиваемая дружественностью.
Ну а тот объявляет эти элементы публичными, и прочие объекты читают их без всякого хака.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Ну а тот объявляет эти элементы публичными, и прочие объекты читают их без всякого хака.
Именно. Если я делаю нормальный класс — я отвечаю за его работу. Я могу сделать в нем дружественным все подряд — это моя ответственность. Пользователь, использующий мой класс, пользуется интерфейсом моего класса.
Теперь, допустим, я делаю крэк-класс, после чего в очередной версии TCustomGrid. Убирают свойство DefaultRowHeight. В случае, если я написал полноценного наследника, куда идет программист — правильно, ко мне, за новой версией моего класса. Если же я написал крэк класс, куда идет программист? полагаю, ответ озвучивать не требуется.
Именно в этом и заключается "хаковость". Крэк-класс не дает собственного, устойчивого интерфейса, а предоставляет доступ к чужому, который этот чужой хотел скрыть. Корректность операций ложится не на плечи автора класса, а на плечи пользователя, который в каждом конкретном случае использует крэк-класс.