Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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


Для массивов объектов лучше использовать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
1-1249031018
Scyth
2009-07-31 13:03
2011.03.20
Отображения объектов DLL по ссылкам


3-1255589577
stas
2009-10-15 10:52
2011.03.20
Сервис и ADO


2-1293283172
sonny2son
2010-12-25 16:19
2011.03.20
Посоветуйте, как установить?


2-1293359993
radiokarazinec
2010-12-26 13:39
2011.03.20
Поиск максимальных трех элементов в массиве


15-1291152578
Юрий
2010-12-01 00:29
2011.03.20
С днем рождения ! 1 декабря 2010 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский