Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > [Delphi2010] property родителей


Автор: CROTishka 25.11.2010, 12:01
просветите пожалуйста, теперь что, все проперти родителя автоматом пробрасываются в потомка? 
раньше же вроде надо было их явно прописывать в виде
Код

 published
    property Action;
    .....
    property Visible;
  end;

Как отрубить у потомка эти свойства? (чтобы в проперти эдиторе не отображались, и в менять/видеть нельзя было). спасибо.

Автор: cat512 25.11.2010, 15:17
Цитата(CROTishka @ 25.11.2010,  12:01)
просветите пожалуйста, теперь что, все проперти родителя автоматом пробрасываются в потомка? 
раньше же вроде надо было их явно прописывать в виде
Код

 published
    property Action;
    .....
    property Visible;
  end;

Как отрубить у потомка эти свойства? (чтобы в проперти эдиторе не отображались, и в коде менять/видеть нельзя было). спасибо.

Что значит автоматом пробрасываются в потомках? В ООП существует концепция наследования объектов, которая строго определяет контент класса-предка в наследниках, т.е. если у предка имелось какое либо свойство, то оно должно быть и в классе наследнике. (вопрос с доступом переносим в другую плоскость)
Скрыть свойство можно перенеся его в нужную секцию (protected, private). Соответственно скрывать нужно у предка, что-бы оно было не доступно в наследнике. Скрыть только для инспектора объектов, достатосно перенести свойство в секцию public

Автор: CROTishka 25.11.2010, 15:31
Я не то имел в виду. Я имел в виду что раньше если не прописать проперти в паблишед, то они не были видны в проперти эдиторе.

Автор: cat512 25.11.2010, 15:38
А сейчас подругому? Я просто работаю под 6-7, возможно в новых версиях уже чего-то накрутили smile

Автор: CROTishka 25.11.2010, 18:27
Да, сейчас в 2010 проперти видны все, в независимости от визибилити и указаны ли они явно.

Автор: БелАмор 25.11.2010, 23:41
Цитата(CROTishka @  25.11.2010,  18:27 Найти цитируемый пост)
Да, сейчас в 2010 проперти видны все, в независимости от визибилити и указаны ли они явно.

На основании чего сделан такой вывод?
Вы явно что-то путаете.
Я не имел дела с Delphi выше 2006, но не думаю, что там что-то принципиально изменилось. Так что давайте разбираться. Начнём с самого начала.
private - видимость только в этом классе, в наследниках недоступно.
protected - видимость в этом классе и всех потомках.
public - доступно всем
published - доступно всем, сохраняется в dfm, выводится в инспектор объектов.
Если спецификатор видимости не указан - это published
Обычно в базовом классе свойства объявляются как protected. При этом они объявляются с read/write методами. В потомках свойства, которым нужно повысить видимость, указываются в секции public или published без указания методов чтения/записи. Это трактуется как изменение видимости ранее объявленного свойства. Понижать видимость не принято. Некоторые свойства изначально могут объявляться как published, тогда в наследниках нет необходимости увеличивать их видимость
Пример:
Код

  TControl = class(TComponent)
  private
    function GetText: TCaption;
    procedure SetText(const Value: TCaption);
  protected
    property Caption: TCaption read GetText write SetText stored IsCaptionStored;
  end;

  TCustomForm = class(TScrollingWinControl)
  private
    function GetMDIChildCount: Integer;
  protected
    property MDIChildCount: Integer read GetMDIChildCount;
  end;

  TForm = class(TCustomForm)
  public
    property MDIChildCount;
  published
    property Caption;
  end;

Посмотрите конкретно эти свойства в своей Delphi 2010. Вряд ли там что-то должно сильно измениться конкретно с Caption и MDIChildCount.
Если у вас в инспекторе объектов отображаются какие-то свойства, которые отображаться не должны, приведите конкретный пример.

Автор: CROTishka 26.11.2010, 09:43
Спасибо большое, я понял в чём соль. 
И всё-таки, их можно как-то скрыть, после того уже, как они объявлены с видимостью паблишед?

Автор: БелАмор 26.11.2010, 21:42
Цитата(CROTishka @  26.11.2010,  09:43 Найти цитируемый пост)
И всё-таки, их можно как-то скрыть, после того уже, как они объявлены с видимостью паблишед?

При попытке понизить в потомках видимость чего-либо, в действие вступают достаточно неочевидные механизмы. Поэтому, даже если это и можно сделать, я бы советовал принять как асиому и неукоснительно выполнять правило:
В наследниках видимость можно только повышать, и ни при каких обстоятельствах не следует пытаться её понижать.

Что касается возможности не отображать в инспекторе объектов часть свойств, то я смутно припоминаю, что встречал упоминание о том, что в какой-то из последних версий Delphi вроде бы появилась возможность настройки видимости свойств в самом инспекторе объектов. Так ли это, и если так, то как реализуется и насколько это полезно - сказать не могу.

Автор: AnalogXP 26.11.2010, 22:19
CROTishka, http://www.rsdn.ru/forum/shareware/3670387.1.aspx

Автор: CROTishka 3.12.2010, 16:59
я помнится пару лет назад долго тупил, когда увидел в коде изменение константы. как же удивятся люди когда увидят доступ к strict private.
интересная тема, но не совсем то.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)