Конференция "Компоненты" » Перекрытие SetColor
 
  • Семеныч (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] что написано? Не то же самое?
 
Конференция "Компоненты" » Перекрытие SetColor
Есть новые Нет новых   [134464   +62][b:0][p:0.001]