TA = class
private
protected
public
property test : integer read .. write ...;
published
property test1 : integer read .. write ...;
end;
Скрытие свойств и методов
Код:
От него я наследую класс В:
Код:
TB = class(TA)
end;
end;
Задача: от пользователя надо скрыть в классе B поля test и test1 (т.е. перенести их в private или protected). В книге "Иллюстрированный самоучитель по Delphi 7 для профессионалов" прямо написано, что переносить свойства из public в private нельзя, но из private в public можно. Тем не менее, вот такой трюк работает и свойство test не видно пользователю:
Код:
TB = class(TA)
private
property test;
public
end;
private
property test;
public
end;
Если попробывать тот же подход для published, то можно жестоко обломаться:
Код:
TB = class(TA)
private
property test;
property test1; // это св-во видно пользователю как св-во родительского класса.
public
end;
private
property test;
property test1; // это св-во видно пользователю как св-во родительского класса.
public
end;
В FAQ Delphi Russian Knowledge Base я нашел такой пример:
Цитата:
Как скрыть свойства объекта?
В иерархии VCL в большинстве случаев существует уровень объектов-"предшественников" (TCustomXXXX), в которых многие свойства скрыты. Для унаследованных от таких "предшественников" объектов можно "открывать" на выбор те или иные свойства. А как можно скрыть свойства, которые объявлены в published-области от Object Inspector'а, но при этом оставить возможность доступа во время работы программы? Решение состоит в объявлении свойства "по новой" в public-области. В примере скрытым будет у объекта TMyControl свойство Height.
Код:
TMyControl = class(TWinControl)
protected
procedure SetHeight(Value: Integer);
function GetHeight: Integer;
public
property Height: Integer read GetHeight write SetHeight;
end;
procedure TMyControl.SetHeight(Value: Integer);
begin
inherited Height := Value;
end;
function TMyControl.GetHeight;
begin
Result := inherited Height;
end;
protected
procedure SetHeight(Value: Integer);
function GetHeight: Integer;
public
property Height: Integer read GetHeight write SetHeight;
end;
procedure TMyControl.SetHeight(Value: Integer);
begin
inherited Height := Value;
end;
function TMyControl.GetHeight;
begin
Result := inherited Height;
end;
но он не работает :(
Вопрос: каким образом можно скрыть published свойства?
Согласно правилам ООП, понижать видимость при наследовании нельзя. Наличие возможности этого в Дельфи - нарушение правил. Бери пример с VCL - делай Custom-предка, открывая свойства в наследниках по мере необходимости.
Открыть это не проблема, а вот скрыть. Можно пример?
Или Delphi (в отличие от Builder'а) это не позволяет?
А вот это тоже вопрос, искал в книгах - не нашел :-/
Робяты, private методы делаются специально, чтобы никто до них не добралсо. Если очень нужно сделать в потомке свой метод - делай. На это всё и расчитано.
Всё очень просто. IL84, если возникает необходимость скрыть published свойства - значит при проектировании твоей системе (в которой нужно скрыть) допущена ошибка. Выявить её нелегко, зато так хотя бы можно понять, что она есть до того, как она вылезет
Ошибок нет, просто некоторые published свойства обрабатываются мной внутри компонента и я не хочу, чтобы пользователь их видел и обрабатывал. Лично мне нравиться идея protected наследования как в С++, но в Делфи такого нет :-/