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

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

Класс-контейнер


Goorus ©   (2004-08-09 11:57:00) 

При создании проекта, часто приходится использовать классы-контейнеры. Не хочется каждый раз писать один и тот же код, одни и теже алгоритмы добавления/удаления обектов. Может есть способ как использовать один и тот же шаблон для различных типов?

Ну скажем есть у меня классы Tclass1, Tclass2.

Нужно создать класс-контейнер:

Tclass1_container=class
 Objes:array of Tclass1;
 //
 ...
 //
 fucntion Count:Integer;
 function AddObject:Tclass1;
 procedrue DelObject;
 ...
 property OneObj[Index:Integer]:Tclass1 read Get write Put; default;
end;

А если мне понадобится контейнер для Tclass2, то придётся писать тот же код заново?

Конечно можно задать Objes:array of TObject, но тогда всё-равно придётся переписывать Get, Put, AddObject...
Может есть другое решение?


Goorus   (2004-08-10 08:39:00) [1]

Понятно, интерфейсы, значит, вообще не для того.
Придётся создавать кучу контейнеров... Но нам не в первой :)


Кщд   (2004-08-10 06:20:00) [2]

интерфейсы
хорошие статьи на эту тему у А. Тенцера


Goorus   (2004-08-10 05:24:00) [3]

А вообще зачем нужен второй параметр при создании класса, ну который типа Interface1, Interface2, Interface N? Читал справку - нчего не понял :) Смотрел модуль Classes - эффект тот же.
Для чего вот это:
TInterfacedPersistent = class(TPersistent, IInterface)?

PS Я ни такой уж и новичок, просто не сталкивался с этим.


Mim1   (2004-08-09 21:44:00) [4]


> Ну не хочется каждый раз использовать приставку TClass2

Посмотрите как реализуются наследники TCollection для избежания использования этой приставки. С помощью простой аналогии вы можете с легкостью написать наследника TObjectList для своего класса.


GuAV   (2004-08-09 15:01:00) [5]

TObjectList - отличается тем, что умеет отвечать за уничтожение
TComponentList - использованием FreeNotification компонента
а TClassList - ... таки да, это пример переписывания контейнера под конкретный класс. Я про этот простор раньше не знал - не приходилось пользоваться. Я бы рекомендовал использовать такое, а не [0]. Тогда просто тупо заменить TClass на чего-то ещё.
получается, что

>  Мне нужен только ответ на вопрос: возможно ли создать такой
> контейнер

нет.


Goorus   (2004-08-09 14:06:00) [6]

>> GuAV
Не понимаю я этого смысла. Ведь метод Free есть ещё у TObject?

Но это отвлечение от темы. Мне нужен только ответ на вопрос: возможно ли создать такой контейнер.


афвуд   (2004-08-09 13:30:00) [7]

Переходи на С++ Builder. И юзай шаблоны языка С++. ИМХО то, что решит твою проблему.


GuAV   (2004-08-09 13:22:00) [8]

У модуля не в том смысл, а в том смысл, что они TObjectList, TClassList, TComponentList могут отвечать за уничтожение вверенных им объектов.


Goorus   (2004-08-09 12:44:00) [9]

Ну не хочется каждый раз использовать приставку TClass2(...).
В этом-то весь смысл :)

Вообщем понятно - такой конструкции не предусмотрено, иначе бы авторы Delphi сами её использовали, а они целый модуль писали (Contnrs) :) Отдельно для TObjectList, TClassList, TComponentList.


GuAV   (2004-08-09 12:30:00) [10]


> Короче, всё равно для каждлого класса придётся переписывать
> некоторые функции :(

Нет же, не надо
var List: TList;
...
TClass2(List1.Items[I]).Class2Property ...


Goorus   (2004-08-09 12:19:00) [11]

>> VMcL
Написать полноценный игровой движок :) Шутка, на самом деле мне просто интересно.

Короче, всё равно для каждлого класса придётся переписывать некоторые функции :( Вот тебе и объектно-ориентированное программирование...

Я имел в виду может можно задать контейнер типа

type
 Tclass1_Container=class(TContainer, Tclass1);

, где TContainer - тот самый контейнер, вроде TObjectList, а Tclass1 - нужный класс.


anton@fms.sochi.ru   (2004-08-09 12:04:00) [12]

В модуле Contnrs существуют классы:
TObjectList - для хранения TObject
TClassList - для хранения TClass
TComponentList - для хранения TComponent


GuAV   (2004-08-09 12:04:00) [13]


> Tclass1_container=class

не с нуля писать лучше а воспользоваться  TList, TObjectList, ...


VMcL   (2004-08-09 12:02:00) [14]

>> Goorus ©  (09.08.04 11:57)

Какую задачу нужно решить?


Sandman25   (2004-08-09 11:59:00) [15]

Явное приведение типа.

(TClass2)ObjectList1.Item[N]


Наверх

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