Текущий архив: 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.47 MB
Время: 0.031 c