Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Самоагрегация" [D7, WinXP]


Страницы:   1 2

chaika_sv ©   (2010-12-24 09:49:00) 

Всем привет.

Подскажите, как сделать так, чтобы объект некоторого класса мог агрегировать объекты этого же класса.
Ну то есть, если есть класс TClass, то хочется сделать как-то так:

TClass = class
...
obj: TClass;
...
end;


Германн   (2010-12-26 02:51:00) [1]


> Юрий Зотов ©   (26.12.10 02:15) [23]
>
> > TCollection
>
> Тоже, ИМХО, неудачное название. Коллекция - это слишком
> общо

Значит "удачное" название пока никто из русскоязычных не придумал.
Хотя TList лично для меня настолько родной, что я и не вспоминаю "семантику".
:)


Юрий Зотов   (2010-12-26 02:15:00) [2]

> TCollection

Тоже, ИМХО, неудачное название. Коллекция - это слишком общо, размыто, годится для интерфейса, но не для класса. В той же джаве, Collection - это общий интерфейс, от которого порождены List, Set и прочие интерфейсы, каждый со своими приблудами - а уж их имплементируют самые разные классы.

И хотя я джаву уже почти ненавижу (ущербный язычок для юных пионэров), но должен признать, что многое в ней сделано совсем даже неплохо.


Игорь Шевченко   (2010-12-25 14:54:00) [3]


> В самом деле, через массив указателей сделано ... (


Зато с возможностью произвольного доступа.

На мой такой взгляд, зря Borland этот класс TList обозвал. Сразу путаница в незрелых умах :)
В Turbo Vision он назывался TCollection и выполнял аналогичные функции.


Ega23   (2010-12-25 10:09:00) [4]

Для каждого из типа списков есть своя "ниша".


Recurse   (2010-12-25 10:01:00) [5]


> Ega23 ©   (25.12.10 09:53) [19]

В самом деле, через массив указателей сделано ... (
А в менеджере памяти список блоков - через цепочку )


Ega23   (2010-12-25 09:53:00) [6]


> Опа-на! А меня учили, что список - это совсем другая структура
> данных, связанная с указателями. Мы даже писали лабу по
> спискам)


Списки бывают разные. Например - цепочка, где каждый элемент имеет указатель на следующий (а в случае двунаправленной - и на предыдущий).
Можно организовать в виде массива указателей (как TList, TObjectList, TStringList, etc).
Смотри исходники TList, там всё довольно прозрачно.


Recurse   (2010-12-25 09:47:00) [7]


> Дык и TList тоже
> Обертка вокруг массива.

Опа-на! А меня учили, что список - это совсем другая структура данных, связанная с указателями. Мы даже писали лабу по спискам)


_Юрий   (2010-12-24 21:47:00) [8]


> Игорь Шевченко ©   (24.12.10 20:14) [16]


Дык и TList тоже
Обертка вокруг массива.
Просто если массив не меняется, обертка особо не нужна. Ее еще и финализировать надо явно, в отличие от массива


Игорь Шевченко   (2010-12-24 20:14:00) [9]


> Если количество элементов массива постоянно с момента рождения
> и до смерти, то лучше использовать массив.
> А если должны быть вставки и удаления - то лист



> TObjectList<T>


Это некоторым образом тоже массив :)


_Юрий   (2010-12-24 19:36:00) [10]

Если количество элементов массива постоянно с момента рождения и до смерти, то лучше использовать массив.
А если должны быть вставки и удаления - то лист


> Для массивов объектов лучше использовать TObejctList


Третий вариант
TObjectList<T>


Юрий Зотов   (2010-12-24 15:47:00) [11]

Для любых массивов (и немассивов, кстати, тоже) лучше использовать то, что больше подходит в данной конкретной задаче.
:o)


Ega23   (2010-12-24 14:25:00) [12]


> Для массивов объектов лучше использовать TList


Для массивов объектовлучше использовать T ObejctList


Dimka Maslov   (2010-12-24 14:12:00) [13]

Для массивов объектов лучше использовать TList


Юрий Зотов   (2010-12-24 12:40:00) [14]


> chaika_sv ©   (24.12.10 11:11) [8]
> так можно класс "предопределить"

Официально это называется "опережающее объявление класса". Аналогичным способом можно объявлять и функции, только с описателем forward:

procedure MyProc(...); forward;

procedure CallMyProc(...);
begin
 ...
 MyProc(...);
 ...
end;

procedure MyProc(...);
begin
 ...
end;


chaika_sv   (2010-12-24 11:50:00) [15]

Спасибо! Буду знать.


Ega23   (2010-12-24 11:18:00) [16]


> не знал, что так можно класс "предопределить"


Это не "переопределение", это подсказка компилятору, что сам класс будет объявлен позднее.
В основном используется для перекрёстных ссылок.
Например, есть классы A и Б. А как-то внутри ссылается на Б. Б как-то внутри ссылается на А.
Можно в ран-тайм проверять:

TAClass = class
private
 FB: TObject
.....

TBClass = class
 FA: TA;

if FB is TB then .....


А можно так:

TAClass = class;
TBClass = class;
.....

TAClass = class (...)
 FB: TBClass;
 ....


chaika_sv   (2010-12-24 11:11:00) [17]

Ega23, о круто! Спасибо.. честно, не знал, что так можно класс "предопределить"


brother   (2010-12-24 11:03:00) [18]

> С каких это пор?

по пятницам низя! Да чет тупанул... не о том подумал)


Ega23   (2010-12-24 10:52:00) [19]


> если в секции type, то так нельзя...


С каких это пор?


Ega23   (2010-12-24 10:50:00) [20]


type
 TMyClass = class;

 TMyClassArray = array of TMyClass;

 TMyClass = class (TObject)
 private
   FMyClassArray : TMyClassArray;
 end;



Нет проблем.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо