Форум: "Начинающим";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];
Вниз"Самоагрегация" Найти похожие ветки
← →
chaika_sv © (2010-12-24 09:49) [0]Всем привет.
Подскажите, как сделать так, чтобы объект некоторого класса мог агрегировать объекты этого же класса.
Ну то есть, если есть класс TClass, то хочется сделать как-то так:
TClass = class
...
obj: TClass;
...
end;
← →
icWasya © (2010-12-24 09:51) [1]А в чём проблема?
← →
chaika_sv © (2010-12-24 10:01) [2]Ой, да.. Прошу прощения, здесь я зря упростил пример.
На самом деле, надо чтобы объект некоторого класса мог агрегировать массив объектов этого же класса. Причём нет никакой проблемы написать так:
TClass = class
...
obj: array of TClass;
...
end;
Но что если я хочу создать тип - массив:
TClassMass = array of TClass;
TClass = class
...
obj: TClassMass;
...
end;
- вот так не выходит :(
← →
brother © (2010-12-24 10:10) [3]> TClassMass = array of TClass;
если в секции type, то так нельзя...
← →
chaika_sv © (2010-12-24 10:15) [4]
> если в секции type, то так нельзя...
Да, в секции Type...
Так-то я делал вот такую вещь:
TClassRef = ^TClass;
TClassMass = array of TClassRef;
TClass = class
...
obj: TClassMass;
...
end;
- это работает, но уж больно неудобно потом с этими TClassRef работать.
← →
Ega23 © (2010-12-24 10:50) [5]
type
TMyClass = class;
TMyClassArray = array of TMyClass;
TMyClass = class (TObject)
private
FMyClassArray : TMyClassArray;
end;
Нет проблем.
← →
Ega23 © (2010-12-24 10:52) [6]
> если в секции type, то так нельзя...
С каких это пор?
← →
brother © (2010-12-24 11:03) [7]> С каких это пор?
по пятницам низя! Да чет тупанул... не о том подумал)
← →
chaika_sv © (2010-12-24 11:11) [8]Ega23, о круто! Спасибо.. честно, не знал, что так можно класс "предопределить"
← →
Ega23 © (2010-12-24 11:18) [9]
> не знал, что так можно класс "предопределить"
Это не "переопределение", это подсказка компилятору, что сам класс будет объявлен позднее.
В основном используется для перекрёстных ссылок.
Например, есть классы 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:50) [10]Спасибо! Буду знать.
← →
Юрий Зотов © (2010-12-24 12:40) [11]
> chaika_sv © (24.12.10 11:11) [8]
> так можно класс "предопределить"
Официально это называется "опережающее объявление класса". Аналогичным способом можно объявлять и функции, только с описателем forward:
procedure MyProc(...); forward;
procedure CallMyProc(...);
begin
...
MyProc(...);
...
end;
procedure MyProc(...);
begin
...
end;
← →
Dimka Maslov © (2010-12-24 14:12) [12]Для массивов объектов лучше использовать TList
← →
Ega23 © (2010-12-24 14:25) [13]
> Для массивов объектов лучше использовать TList
Для массивов объектов лучше использовать TObejct
List
← →
Юрий Зотов © (2010-12-24 15:47) [14]Для любых массивов (и немассивов, кстати, тоже) лучше использовать то, что больше подходит в данной конкретной задаче.
:o)
← →
_Юрий (2010-12-24 19:36) [15]Если количество элементов массива постоянно с момента рождения и до смерти, то лучше использовать массив.
А если должны быть вставки и удаления - то лист
> Для массивов объектов лучше использовать TObejctList
Третий вариант
TObjectList<T>
← →
Игорь Шевченко © (2010-12-24 20:14) [16]
> Если количество элементов массива постоянно с момента рождения
> и до смерти, то лучше использовать массив.
> А если должны быть вставки и удаления - то лист
> TObjectList<T>
Это некоторым образом тоже массив :)
← →
_Юрий (2010-12-24 21:47) [17]
> Игорь Шевченко © (24.12.10 20:14) [16]
Дык и TList тоже
Обертка вокруг массива.
Просто если массив не меняется, обертка особо не нужна. Ее еще и финализировать надо явно, в отличие от массива
← →
Recurse (2010-12-25 09:47) [18]
> Дык и TList тоже
> Обертка вокруг массива.
Опа-на! А меня учили, что список - это совсем другая структура данных, связанная с указателями. Мы даже писали лабу по спискам)
← →
Ega23 © (2010-12-25 09:53) [19]
> Опа-на! А меня учили, что список - это совсем другая структура
> данных, связанная с указателями. Мы даже писали лабу по
> спискам)
Списки бывают разные. Например - цепочка, где каждый элемент имеет указатель на следующий (а в случае двунаправленной - и на предыдущий).
Можно организовать в виде массива указателей (как TList, TObjectList, TStringList, etc).
Смотри исходники TList, там всё довольно прозрачно.
← →
Recurse (2010-12-25 10:01) [20]
> Ega23 © (25.12.10 09:53) [19]
В самом деле, через массив указателей сделано ... (
А в менеджере памяти список блоков - через цепочку )
← →
Ega23 © (2010-12-25 10:09) [21]Для каждого из типа списков есть своя "ниша".
← →
Игорь Шевченко © (2010-12-25 14:54) [22]
> В самом деле, через массив указателей сделано ... (
Зато с возможностью произвольного доступа.
На мой такой взгляд, зря Borland этот класс TList обозвал. Сразу путаница в незрелых умах :)
В Turbo Vision он назывался TCollection и выполнял аналогичные функции.
← →
Юрий Зотов © (2010-12-26 02:15) [23]> TCollection
Тоже, ИМХО, неудачное название. Коллекция - это слишком общо, размыто, годится для интерфейса, но не для класса. В той же джаве, Collection - это общий интерфейс, от которого порождены List, Set и прочие интерфейсы, каждый со своими приблудами - а уж их имплементируют самые разные классы.
И хотя я джаву уже почти ненавижу (ущербный язычок для юных пионэров), но должен признать, что многое в ней сделано совсем даже неплохо.
← →
Германн © (2010-12-26 02:51) [24]
> Юрий Зотов © (26.12.10 02:15) [23]
>
> > TCollection
>
> Тоже, ИМХО, неудачное название. Коллекция - это слишком
> общо
Значит "удачное" название пока никто из русскоязычных не придумал.
Хотя TList лично для меня настолько родной, что я и не вспоминаю "семантику".
:)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c