Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Property со сложным типом


Автор: Traum 2.9.2007, 19:49
В качестве примера возьмем тип TMemo:

Код

type TMemo = class(...);

  private

     FLines: TStrings;
     ...

  public
     ...
     property Lines:TStrings read FLines write SetLines;
     ...

end;


Если я что-либо присваиваю Lines, то TMemo через метод SetLines будет в курсе происходящего. А если я, получив ссылку на FLines посредством доступа read, использую методы и свойства TStrings и тем самым модифицирую FLines, то как TMemo знает, что творится с его Flines?

Автор: Snowy 2.9.2007, 20:22
Это потому что Lines у Memo это не TStringList, а свой класс, который тоже следит за тем, что у него там творится.

Автор: MetalFan 2.9.2007, 20:36
Цитата(Traum @  2.9.2007,  19:49 Найти цитируемый пост)
А если я, получив ссылку на FLines посредством доступа read, использую методы и свойства TStrings и тем самым модифицирую FLines

смотри кишки vcl StdCtrls.TMemoStrings
наследники TStrings разные бывают)

Автор: Esperito 2.9.2007, 21:16
Код

constructor TCustomMemo.Create(AOwner: TComponent);
begin
  ...
  TMemoStrings(FLines).Memo := Self;
  ...
end;

Таким образом, FLines всё знает про Memo, ибо TMemoStrings для такого и заточена.

Автор: lukas 2.9.2007, 21:48
Код

type TMemo = class(...);
  private
     FLines: TStringList;
     ...
  public
     ...
     property Lines:TStrings read FLines write SetLines;
     ...
end;


Используй для этих целей TStringList, не абстрактный класс... а TStrings - это абстрактный класс... 

Автор: Traum 2.9.2007, 21:50
Спасибо, с Memo ясно. 

Но вопрос остался для меня не ясным: TMemo я привел в качестве примера. Я хочу создать свой тип, при этом хочу быть в курсе происходящего и контролировать модификации поля FComplex :

Код

type TMyType = class
  
  private

     FComplex : TSomeComplexType;
     ...
  public
    ...
    property Complex : TSomeComplexType read FComplex ; 

end;


Есть ли возможность контролировать произвол модификации поля FComplex, который возможен благодаря методам и свойств TSomeComplexType?

Вариант - не давать этого property и дублировать в public методы и свойства TSomeComplexType - не очень привлекателен

Ответ Esperito наводит на мысль что стоит делать так: FComplex объявить как переменную типа TSomeComplexType, но для TSomeComplexType создать наследника, заточенного под себя, и создавать FComplex методом этого наследника. Возможно этим мой вопрос закрыт

 

Автор: Snowy 2.9.2007, 23:42
Если поле - класс, то он должен сам себя контролировать.
Если требуется уведоблять класс-владелец, то заведи события для этого.

Автор: Esperito 3.9.2007, 16:17
Сделай так:
Код

type
  TMyType = class
  private
    FComplex : TSomeComplexType;
    function GetComplex: TSomeComplexType;
    procedure SetComplex(const Value: TSomeComplexType);
  public
    property Complex: TSomeComplexType read GetComplex write SetComplex;
  end;

Автор: Traum 3.9.2007, 20:13

Общие вопросы новичка в области программирования:

1. Если пользователю предоставляется набор инструментов, то он вправе думать, что он вправе их все использовать?. Тогда
Если в рамках примера с TMemo есть возможность запустить команду TMemo.Lines.Free, которая уничтожает объект, на который указывает поле FLines, то пользователь может полагать что это не зря так допущено?

2. Верно ли что ни в DelphiLanguageGuide, ни DevelopersGuide, ни в русских учебниках или статьях (даже здесь на форуме  smile ), где описывается что такое ООП и как его использовать, не дается ни каких указаний как надежно и контролируемо организовывать prperty со сложными, уже имеющимися типами (например TEdit, TStringList и т.п.).

Esperito, 
Разве может function GetComplex: TSomeComplexType ограничить возможности, предоставляемые TSomeComplexType, и контролировать их использование?


Snowy,
//Если требуется уведоблять класс-владелец, то заведи события для этого. //

Но эти события у TSomeComplexType будут в public и что получится, если пользователь через предоставленное ему property присвоит этим событиям свои процедуры, тогда TMyType остается только надеяться, что пользователь этого не сделает, а если сделает, так пусть винит сам себя, когда будет пытаться понять в чем же глюк?




Автор: Snowy 3.9.2007, 21:04
Цитата(Traum @  3.9.2007,  20:13 Найти цитируемый пост)
Но эти события у TSomeComplexType будут в public
Они будут там, где ты их объявишь.

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