При конструировании объекту классаRangeArrayпередается нижняя граница массива в качестве параметраlow,а верхняя граница — в качестве параметраhigh.Затем значение параметраhighинкрементируется, поскольку пределы индексирования массива изменяются отlowдоhighвключительно. Далее выполняется следующая проверка: является ли верхний индекс больше нижнего индекса. Если это не так, то выдается сообщение об ошибке и создается массив, состоящий из одного элемента. После этого для массива распределяется память, а ссылка на него присваивается переменнойа.Затем свойствоLengthустанавливается равным числу элементов массива. И наконец, устанавливаются переменныеlowerBoundиupperBound.
Далее в классе RangeArray реализуется его индексатор, как показано ниже.
// Это индексатор для класса RangeArray. public int this[int index] {
// Это аксессор get. get {
if(ok(index) ) {
Error = false;
return a[index - lowerBound];
} else {
Error = true; return 0;
}
// Это аксессор set. set {
if(ok(index)) {
a[index - lowerBound] = value;
Error = false;
}
else Error = true;
}
}
Этот индексатор подобен тому, что использовался в классеFailSof tArray,за одним существенным исключением. Обратите внимание на следующее выражение, в котором индексируется массива.
index - lowerBound
В этом выражении индекс, передаваемый в качестве параметраindex,преобразуется в индекс с отсчетом от нуля, пригодный для индексирования массиваа.Данное выражение действует при любом значении переменнойlowerBound:положительном, отрицательном или нулевом.
Ниже приведен методok .
// Возвратить логическое значение true, если // индекс находится в установленных границах, private bool ok(int index) {
if(index >= lowerBound & index <= upperBound) return true; return false;
}
Этот метод аналогичен использовавшемуся в классеFailSof tArray,за исключением того, что в нем контроль границ массива осуществляется по значениям переменныхlowerBoundиupperBound.
КлассRangeArrayдемонстрирует лишь одну разновидность специализированного массива, который может быть создан с помощью индексаторов и свойств. Существуют, конечно, и другие. Аналогичным образом можно, например, создать динамические массивы, которые расширяются или сужаются по мере надобности, ассоциативные и разреженные массивы. Попробуйте создать один из таких массивов в качестве упражнения.
ГЛАВА 11 Наследование