Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.20;
Скачать: CL | DM;

Вниз

"Самоагрегация"   Найти похожие ветки 

 
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


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


 
Юрий Зотов ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.034 c
2-1293086770
Recurse
2010-12-23 09:46
2011.03.20
Вот не пойму


15-1290230521
RGV
2010-11-20 08:22
2011.03.20
Всем! Кто не равнодушен к сокращению часовых поясов


15-1291197987
Jacksotnik
2010-12-01 13:06
2011.03.20
Создание инсталятора


2-1292935575
adigozelov
2010-12-21 15:46
2011.03.20
Treeview1.items.itemid


3-1255340705
Yurikon
2009-10-12 13:45
2011.03.20
Ошибка с драйвером Access