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

Вниз

Класс-контейнер   Найти похожие ветки 

 
Goorus ©   (2004-08-09 11:57) [0]

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

Ну скажем есть у меня классы 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...
Может есть другое решение?


 
Sandman25 ©   (2004-08-09 11:59) [1]

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

(TClass2)ObjectList1.Item[N]


 
VMcL ©   (2004-08-09 12:02) [2]

>>Goorus ©  (09.08.04 11:57)

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


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

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


 
GuAV ©   (2004-08-09 12:04) [4]


> Tclass1_container=class

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


 
Goorus ©   (2004-08-09 12:19) [5]

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

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

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

type
 Tclass1_Container=class(TContainer, Tclass1);

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


 
GuAV ©   (2004-08-09 12:30) [6]


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

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


 
Goorus ©   (2004-08-09 12:44) [7]

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

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


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

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


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

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


 
Goorus ©   (2004-08-09 14:06) [10]

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

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


 
GuAV ©   (2004-08-09 15:01) [11]

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

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

нет.


 
Mim1 ©   (2004-08-09 21:44) [12]


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

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


 
Goorus ©   (2004-08-10 05:24) [13]

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

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


 
Кщд ©   (2004-08-10 06:20) [14]

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


 
Goorus ©   (2004-08-10 08:39) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.09 c
11-1079423831
solo2
2004-03-16 10:57
2004.08.22
Я опять про DCU, подходящих ответов не нашел


3-1090899132
тихий вовочка
2004-07-27 07:32
2004.08.22
Обновление


9-1084004367
Igit
2004-05-08 12:19
2004.08.22
Арканоид. Алгоритм отражения от стен.


14-1091094948
Nelud
2004-07-29 13:55
2004.08.22
Хоумпейдж сделал.


3-1090902055
Morj
2004-07-27 08:20
2004.08.22
Программно выделить строки в DBGrid