![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Самоагрегация" [D7, WinXP]
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
Для массивов объектовлучше использовать TObejctList
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;
Нет проблем.