lowerBound = low; upperBound = —high;
}
При конструировании объекту класса 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 Наследование
Наследование является одним из трех основополагающих принципов объектно- ориентированного программирования, поскольку оно допускает создание иерархических классификаций. Благодаря наследованию можно создать общий класс, в котором определяются характерные особенности, присущие множеству связанных элементов. От этого класса могут затем наследовать другие, более конкретные классы, добавляя в него свои индивидуальные особенности.
В языке C# класс, который наследуется, называется
