![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TObjectList. Правильно ли я делаю?
zorik © (2008-12-11 09:58:00)
TMyList = class;
TMyItem = class
private
FMyList: TMyList;
...
public
...
end;
TMyList = class(TObjectList)
private
...
public
function Add(AItem: TMyItem): Integer; overload;
function Add: Integer; overload;
property Items[Index: Integer] read GetMyItem write SetMyItem;
end;
implementation
function TMyList.Add(AItem: TMyItem): Integer;
begin
result := inherited Add(AItem);
end;
function TMyList.Add: Integer;
var
AItem: TMyItem;
begin
AItem: TMyItem.Create;
AItem.FMyList := self;
result := Add(AItem);
end;
Интересует коректность выделеного с точки зрения ООП. Дело в том что TMyItem нужно знать свойства TMyList
Сергей М. (2008-12-11 11:00:00) [21]Родителем-контейнером вполне можно выбрать и T[Owned]Collection и TComponent - обр.связь элементов с контейнером там уже реализована.
Сергей М. (2008-12-11 10:51:00) [22]Вполне корректно.
Ins (2008-12-11 10:50:00) [23]На мой взгляд, ничего противозаконного тут нет. Нормально, что элемент списка знает о своем контейнере, иногда это нужно. А в RTL/VCL и не такое встречается, так порой класс использует в своем интерфейсе своих же потомков (TFiler -> TReader/TWriter), вот это немного диковато для меня :)
Юрий Зотов (2008-12-11 10:48:00) [24]Объект получает ссылку на свой контейнер - обычное дело.
А вот насчет Add - здесь можно наступить на грабли. Delphi под рукой нет, поэтому проверьте сами - если TObjectList уже имеет метод Add и этот метод не виртуальный, то свои методы Add назовите как-нибудь иначе (например, AddItem). Вообще, если унаследованныйо метод Add(TObject) уже есть, то метод Add(TMyItem) совсем не нужен.
И подумайте насчет Extract. После вызова этого метода объект уже не будет содержаться в контейнере - поэтому не стоит ли в объекте очистить ссылку на контейнер?