Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Class [D5]


TBeginner ©   (2002-08-21 14:20:00) 

Пусть требуется создать несколько классов-списков для хранения данных типа Integer, String, и, допустим, данных типа какая-нибудь запись TMyRecord, не используя при этом TList, TStringList и т. п. (не спрашивайте, почему - это вопрос чисто теоретический). Как это получше сделать - через наследование классов, или же описывать каждый класс полностью отдельно?
Например, для TIntList (с минимумом необходимых свойств):
TIntList = class
private
FItems : array of Integer;
FCount, FDelta, FCapacity : Integer;
function Get (Index : Integer) : Integer;
public
constructor Create (Delta : Integer);
destructor Destroy; override;
procedure Add (Item : Integer);
procedure Delete (Index : Integer);
procedure Pack;
function FindFirst (Value : Integer) : Integer;
property Items [Index : Integer] : Integer read Get;
property Count : Integer read FCount;
end;

Теперь, для списка TMyRecordList нужно делать FItems : array of TMyRecord, а ещё procedure Add (Item : TMyRecord), а ещё function FindFirst (Value : TMyRecord) и т. д., т.е. получается - всё переписывать заново? Или можно вначале определить какой-нибудь класс-родитель? Посоветуйте что-нибудь, только не ругайтесь сильно - я вообще-то не очень в этом пока разбираюсь...


AlexSV   (2002-08-21 15:32:00) [1]

А если в качестве базового взять простой TList?
Все построено на pointer"ах, поэтому и храни хоть
integer, хоть record.


kull   (2002-08-21 15:22:00) [2]


> Skier © (21.08.02 14:55)

Это смотря что нужно?
Если критична скорость работы, количество съедаемой памяти, или просто надо на скору руку склепать приложенице то слишком.

А если нужна универсальность, гибкость, и оперирование с данными заранее неизвестного типа, то - это то что надо.


Skier   (2002-08-21 14:55:00) [3]

>kull
Я думаю, что если он будет хранить в списке (Integer),
то класс для этого (TMyRecordElem) - это слишком...


kull   (2002-08-21 14:50:00) [4]

Можно сделать общий список для всех типов данных. И в его конструктор передавать класс элемента данных.

Ну типа:

type

TMyElement = class
end;

TMyElementClass = class of TMyElement;

TMyList = class
...
public
constructor Create(const MyElementClass: TMyElementClass);
end;


TMyRecordElem = class(TMyElement)
end;

.....
begin
TMyList.Create(TMyRecordElem);
...

хотя все это ненужная замена TList.


Digitman   (2002-08-21 14:37:00) [5]

Более правильно (концептуально), эффективно, просто и изящно, конечно же, будет создание базового класса, имеющего некий набор виртуальных абстрактных методов управления списком.

Другой вопрос, что списки, которые будут управляться наследниками такого класса, должны иметь разнородные структуры. Но и это решаемо (хотя и не очень удобно)


Skier   (2002-08-21 14:28:00) [6]

>TBeginner
Если я правильно тебя понял, то
можно сделать общий список для твоих данных
TCommonList = class;
где каждый элемент будет иметь следующий вид :

TCommonRec = packed record
crDataType : Byte; //тип данных
crData : Pointer; //указатель на данные...
end; //TCommonRec
PCommonRec= ^TCommonRec;


Ученик   (2002-08-21 14:25:00) [7]

Похоже на Source\Decision Cube\Mxarrays.pas


Наверх

Титульная страница Поиск, карта сайта Написать письмо