Главная страница
    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.47 MB
Время: 0.031 c
3-1090912704
Fynjy
2004-07-27 11:18
2004.08.22
Как удалить таблицу из базы?


1-1091211709
Влад
2004-07-30 22:21
2004.08.22
Процедурный тип в TP7


14-1091463976
Мазут Береговой
2004-08-02 20:26
2004.08.22
Вот такая музыка у меня вышла.


1-1091795371
NailMan
2004-08-06 16:29
2004.08.22
Чем можно графики отображать?


1-1091641900
sqwer
2004-08-04 21:51
2004.08.22
Tray Icon





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский