![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Класс-контейнер
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]