Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.031 c
14-1091605396
Alx2
2004-08-04 11:43
2004.08.22
Домохозяин. Или как угодить обывателю?


14-1091283695
СатирЪ
2004-07-31 18:21
2004.08.22
Пересечение символьных множеств.


9-1083338063
Pirate
2004-04-30 19:14
2004.08.22
ДВИЖОК


4-1089625023
DVM
2004-07-12 13:37
2004.08.22
CAD программно в Win9X


1-1091642631
Phoe-NIX
2004-08-04 22:03
2004.08.22
Текстовый ресурс -> TStringList





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