Индексные свойства

We use cookies. Read the Privacy and Cookie Policy

Индексные свойства

Индексные свойства ведут себя аналогично полям-массивам и используются, как правило, для доступа к элементам контейнеров. Как и при использовании обычных свойств, при использовании индексных свойств могут попутно выполняться некоторые действия.

Индексное свойство описывается в классе следующим образом:

property Prop[описание индексов]: тип read имя функции чтения write имя процедуры записи;

В простейшем случае одного индекса описание индексного свойства выглядит так:

property Prop[ind: тип индекса]: тип read имя функции чтения write имя процедуры записи;

В этом случае функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:

function GetProp(ind: тип индекса): тип;

procedure SetProp(ind: тип индекса; v: тип);

Всякий раз, когда мы для объекта a, содержащего свойство Prop, выполняем присваивание a.Prop[ind] := value, вызывается процедура SetProp(ind,value), а когда считываем значение a.Prop[ind], вызывается функция GetProp(ind).

Индексное свойство, после которого добавлено ключевое слово default с последующей ;, называется индексным свойством по умолчанию и позволяет пользоваться объектами класса как массивами, т.е. использовать запись a[ind] вместо a.Prop[ind].

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

В следующем примере индексное свойство используется для закрашивания/стирания клеток шахматной доски в графическом режиме.

uses GraphABC;

const

n = 8;

sz = 50;

type ChessBoard = class

private

a: array [1..n,1..n] of boolean;

procedure setCell(x,y: integer; value: boolean);

begin

if value then

Brush.Color := clWhite

else Brush.Color := clBlack;

Fillrect((x-1)*sz+1,(y-1)*sz+1,x*sz,y*sz);

a[x,y] := value;

end;

function getCell(x,y: integer): boolean;

begin

Result := a[x,y];

end;

public

property Cells[x,y: integer]: boolean read getCell write setCell; default;

end;

var c: ChessBoard := new ChessBoard;

begin

var x,y: integer;

for x:=1 to n do

for y:=1 to n do

c[x,y] := Odd(x+y);

end.