Форум: "Основная";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c