Книга: Описание языка PascalABC.NET
Индексные свойства
Индексные свойства
Индексные свойства ведут себя аналогично полям-массивам и используются, как правило, для доступа к элементам контейнеров. Как и при использовании обычных свойств, при использовании индексных свойств могут попутно выполняться некоторые действия.
Индексное свойство описывается в классе следующим образом:
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 tondo
for y:=1 tondo
c[x,y] := Odd(x+y);
end.
- Обзор классов и объектов
- Видимость членов класса и модификаторы доступа
- Методы
- Инициализаторы полей
- Конструкторы
- Предварительное объявление классов
- Переменная Self
- Свойства
- Индексные свойства
- Наследование
- Переопределение методов
- Наследование конструкторов
- Виртуальные методы и полиморфизм
- Абстрактные методы
- Перегрузка операций
- Классовые поля, методы и конструкторы
- Методы расширения
- Анонимные классы
- Автоклассы
- 11.2. СВОЙСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
- 4. Свойства унарных операций
- 3. Свойства бинарных операций
- Ключевые свойства форм
- 1.1.5. Свойства и особенности туруслуг и турпродуктов
- Свойства меню Пуск
- Работа с дополнительными свойствами файлов
- Глава 5. Товар и товарная категория. Характеристики и свойства
- Свойства StdErr, StdIn, StdOut
- Дополнительные свойства поля
- Свойства
- Устранение конфликтов имен WSDL с помощью свойства MessageName