Главная страница
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.015 c
3-3265
New123
2002-08-11 02:04
2002.09.02
Порядок записей по умолчанию в таблице


1-3392
[BAD]Angel
2002-08-22 13:46
2002.09.02
Как узнать?


3-3294
Leran2002
2002-08-13 07:34
2002.09.02
TQuickRep


1-3362
maxim2
2002-08-22 08:09
2002.09.02
Не запускается Delphi говорить что испорчен файл RTL60.BPL


1-3508
Ученик
2002-08-21 11:32
2002.09.02
TObject.FieldAddress