Для хранения данных с прямым доступом используются различные структуры - основанные на указателях, статические и динамические массивы, файлы, разделяемая память и т.п. В ООП, для универсализации подхода к хранению данных, обычно разрабатывается иерархия классов, объекты которых позволяют обеспечить единообразный доступ к данным, вне зависимости от способа хранения. Задача заключается в разработке такой иерархии.
TAbstractStorage ─➤ TMemStorage ─➤ TIntMemStorage ╰───────➤ TFloatMemStorageОписание классов и вспомогательных типов данных:
type // базовый тип элемента данных в хранилище TData=pointer; // абстрактный класс с описанием механизма доступа к данным { TAbstractStorage } TAbstractStorage=class protected function getData(position:qword):TData;virtual;abstract; procedure setData(position:qword; value:TData);virtual;abstract; function getCount:qword;virtual;abstract; protected property data[position:qword]:TData read getData write setData; default; property count:qword read getcount; end; // класс с реализацией хранилища в оперативной памяти // с автоматическим расширением хранилища при попытке сохранения // данных за его пределами и возвратом нулевого значения // при попытке чтения данных за его пределами. { TMemStorage } TMemStorage=class(TAbstractStorage) private fdata:array of TData; protected function getData(position:qword):TData;override; procedure setData(position:qword; value:TData);override; function getCount:qword;override; end; // класс с реализацией хранилища целочисленных данных в оперативной памяти // с преобразованием типа данных integer в TData и обратно. { TIntMemStorage } TIntMemStorage=class(TMemStorage) protected function getIData(position:qword):integer; procedure setIData(position:qword; value:integer); public property dataI[position:qword]:integer read getIData write setIData; default; end; // класс с реализацией хранилища вещественных данных максимальной емкости в оперативной памяти // с выделением из оперативной памяти требуемого объема при первом сохранении элемента // по каждому индексу и освобождением выделенной памяти деструктором. // Преобразование TData <-> extended по аналогии с классом TIntMemStorage невозможно, // так как размер типа extended превышает размер типа TData. { TFloatMemStorage } TFloatMemStorage=class(TMemStorage) protected function getfData(position:qword):extended; procedure setfData(position:qword; value:extended); public property dataF[position:qword]:extended read getfData write setfData; default; destructor Destroy;override; end;
Пример тестовой программы | Результат |
---|---|
var x:TFloatMemStorage; y:TIntMemStorage; begin x:=TFloatMemStorage.Create; x[2]:=1.2; writeln(x[0]:0:2); writeln(x[2]:0:2); writeln(x.count); x.free; y:=TIntMemStorage.Create; y[5]:=7; y[3]:=8; writeln(y[1]); writeln(y[3]); writeln(y[5]); writeln(y.count); y.free; end. |
0.00 1.20 3 0 8 7 6 |
TAbstractStorage ─➤ TMemStorage ─➤ TIntMemStorage │ ╰───────➤ TFloatMemStorage ╰──────────➤ TFileStorage ─➤ TIntFileStorageПроверить работоспособность созданных классов.