-
Семеныч (04.04.08 13:32) [20]> capkoh © (04.04.08 11:11) [19]
> можно подобраться к SetColor() в TCustom*.
Не совсем так. Если метод объявлен в секции private, то подобраться нему напрямую из другого модуля нельзя никак (по крайней мере, легальными способами). Но через Hack-класс можно подобраться ко всей секции protected - и если в ней объявлено свойство, то через него получаем неявный доступ к методам его записи/чтения, даже когда сами эти методы сидят в private. -
TStas © (08.04.08 21:30) [21]>можно подобраться ко всей секции protected - и если в ней объявлено свойство, то через него получаем неявный доступ к методам его записи/чтения, даже когда сами эти методы сидят в private ???
Можно подробнее? -
Семеныч (08.04.08 21:57) [22]> TStas © (08.04.08 21:30) [21]
Дык... куда ж еще-то подробнее?
Кидаем на форму TGroupBos и пишем:
type
THackGroupBox = class(TCustomGroupBox);
procedure TForm1.FormCreate(Sender: TObject);
begin
// TCustomGroupBox(GroupBox1).Color := clRed; - ошибка компиляции.
THackGroupBox(GroupBox1).Color := clRed; // работает
end;
В первом случае мы пытались использовать свойство TCustomGroupBox.Clolor, а оно находится в protected и поэтому недоступно. Получаем ошибку компиляции.
Во втором случае мы использовали свойство THackGroupBox.Clolor. Этот класс является потомком TCustomGroupBox и поэтому видит всю его секцию ptotected. Согласно правилам видимости, эта же секция будет видна в том модуле, где объявлен сам класс THackGroupBox, ниже его объявления. И хотя GroupBox1 классу THackGroupBox не принадлежит, приведение типа здесь безопасно, поскольку GroupBox1 является потомком класса TCustomGroupBox, от которого наш класс THackGroupBox ничем не отличается. -
TStas © (09.04.08 11:43) [23]А причем здесь private методы? У потомка вызвано свойство из секции protected, которая только для этого и существует. Где же здесь прямое обращение к private методам? Оно опосредованное. То есть мы же не можем вызвать SetColor(clRed).
-
Семеныч (09.04.08 12:39) [24]> TStas © (09.04.08 11:43) [23]
Стас, ты ветку читал? В [20] что написано? Не то же самое?