Для хранения данных с прямым доступом используются различные структуры - основанные на указателях, статические и динамические массивы, файлы, разделяемая память и т.п. В ООП, для универсализации подхода к хранению данных, обычно разрабатывается иерархия классов, объекты которых позволяют обеспечить единообразный доступ к данным, вне зависимости от способа хранения. Задача заключается в разработке такой иерархии.
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
Проверить работоспособность созданных классов.