Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Скрытие свойств и методов

497
01 ноября 2006 года
IL84
267 / / 24.04.2003
Разрабатываю компонент. Есть класс А

 
Код:
TA = class
  private
 
  protected
 
  public
        property test : integer read .. write ...;
  published
        property test1 : integer read .. write ...;
end;


От него я наследую класс В:
 
Код:
TB = class(TA)
end;


Задача: от пользователя надо скрыть в классе B поля test и test1 (т.е. перенести их в private или protected). В книге "Иллюстрированный самоучитель по Delphi 7 для профессионалов" прямо написано, что переносить свойства из public в private нельзя, но из private в public можно. Тем не менее, вот такой трюк работает и свойство test не видно пользователю:

 
Код:
TB = class(TA)
  private
    property test;
  public

end;


Если попробывать тот же подход для published, то можно жестоко обломаться:
 
Код:
TB = class(TA)
  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;


но он не работает :(

Вопрос: каким образом можно скрыть published свойства?

10
01 ноября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=IL84]каким образом можно скрыть published свойства?[/QUOTE]
Согласно правилам ООП, понижать видимость при наследовании нельзя. Наличие возможности этого в Дельфи - нарушение правил. Бери пример с VCL - делай Custom-предка, открывая свойства в наследниках по мере необходимости.
497
01 ноября 2006 года
IL84
267 / / 24.04.2003
Открыть это не проблема, а вот скрыть. Можно пример?
309
02 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
А если весь класс наследовать, как protected?
Или Delphi (в отличие от Builder'а) это не позволяет?
497
02 ноября 2006 года
IL84
267 / / 24.04.2003
А вот это тоже вопрос, искал в книгах - не нашел :-/
8
02 ноября 2006 года
mfender
3.5K / / 15.06.2005
Робяты, private методы делаются специально, чтобы никто до них не добралсо. Если очень нужно сделать в потомке свой метод - делай. На это всё и расчитано.
8.4K
02 ноября 2006 года
Dian
91 / / 18.02.2006
Всё очень просто. IL84, если возникает необходимость скрыть published свойства - значит при проектировании твоей системе (в которой нужно скрыть) допущена ошибка. Выявить её нелегко, зато так хотя бы можно понять, что она есть до того, как она вылезет
497
02 ноября 2006 года
IL84
267 / / 24.04.2003
Ошибок нет, просто некоторые published свойства обрабатываются мной внутри компонента и я не хочу, чтобы пользователь их видел и обрабатывал. Лично мне нравиться идея protected наследования как в С++, но в Делфи такого нет :-/
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог