Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

Class   Найти похожие ветки 

 
TBeginner   (2002-08-21 14:20) [0]

Пусть требуется создать несколько классов-списков для хранения данных типа 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) и т. д., т.е. получается - всё переписывать заново? Или можно вначале определить какой-нибудь класс-родитель? Посоветуйте что-нибудь, только не ругайтесь сильно - я вообще-то не очень в этом пока разбираюсь...


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

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


 
Skier ©   (2002-08-21 14:28) [2]

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

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


 
Digitman ©   (2002-08-21 14:37) [3]

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

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


 
kull ©   (2002-08-21 14:50) [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.


 
Skier ©   (2002-08-21 14:55) [5]

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


 
kull ©   (2002-08-21 15:22) [6]


> Skier © (21.08.02 14:55)

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

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


 
AlexSV ©   (2002-08-21 15:32) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2002.09.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
1-3497
denimas
2002-08-21 09:55
2002.09.02
Реестр


3-3262
Mike N. Radoman
2002-08-08 18:30
2002.09.02
Как программно добавить вторичный индекс?


1-3431
Yaro
2002-08-18 01:42
2002.09.02
Прозрачный Label на рабочем столе


7-3651
Nash
2002-06-20 11:33
2002.09.02
Диспетчер печати


6-3545
Lina
2002-06-24 15:42
2002.09.02
Может кто-нибудь работал с функцией NetShareAdd ?