Содержимое массива ra3: -20 -19 -18 -17 -16 -15 -14 -13 -12



 

Как следует из результата выполнения приведенного выше кода, объекты типа RangeArray можно индексировать в качестве массивов, начиная с любой точки отсчета, а не только с нуля. Рассмотрим подробнее саму реализацию класса RangeArray.

В начале класса RangeArray объявляются следующие закрытые переменные экземпляра.

 

// Закрытые данные.

int[] а; // ссылка на базовый массив  

int lowerBound; // наименьший индекс  

Int upperBound; // наибольший индекс

 

Переменная а служит для обращения к базовому массиву по ссылке. Память для него распределяется конструктором класса RangeArray. Нижняя граница индексирования массива хранится в переменной lowerBound, а верхняя граница — в переменной upperBound.

Далее объявляются автоматически реализуемые свойства Length и Error.

 

// Автоматически реализуемое и доступное  

//только для чтения свойство Length,  

public int Length { get; private set; }

 

// Автоматически реализуемое и доступное  

//только для чтения свойство Error,  

public bool Error { get; private set; }

 

Обратите внимание на то, что в обоих свойства аксессор set обозначен как private. Как пояснялось выше, такое объявление автоматически реализуемого свойства, по существу, делает его доступным только для чтения.

Ниже приведен конструктор класса RangeArray.

 

// Построить массив по заданному размеру,  

public RangeArray(int low, int high) {  

high++;

if(high <= low) {

Console.WriteLine("Неверные индексы");

high = 1; // создать для надежности минимально допустимый массив

low = 0;

}

а = new int[high - low];

Length = high - low;

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;

}

}

 

Этот индексатор подобен тому, что использовался в классе FailSoftArray, за одним существенным исключением. Обратите внимание на следующее выражение, в котором индексируется массив а.

 

index - lowerBound

 

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

Ниже приведен метод ok().

 

// Возвратить логическое значение true, если  

// индекс находится в установленных границах,  

private bool ok(int index) {

if(index >= lowerBound & index <= upperBound) return true;  

return false;

}

 

Этот метод аналогичен использовавшемуся в классе FailSoftArray, за исключением того, что в нем контроль границ массива осуществляется по значениям переменных lowerBound и upperBound.

Класс RangeArray демонстрирует лишь одну разновидность специализированного массива, который может быть создан с помощью индексаторов и свойств. Существуют, конечно, и другие. Аналогичным образом можно, например, создать динамические массивы, которые расширяются или сужаются по мере надобности, ассоциативные и разреженные массивы. Попробуйте создать один из таких массивов в качестве упражнения.

 

 

ГЛАВА 11 Наследование

 

Наследование является одним из трех основополагающих принципов объектно-ориентированного программирования, поскольку оно допускает создание иерархических классификаций. Благодаря наследованию можно создать общий класс, в котором определяются характерные особенности, присущие множеству связанных элементов. От этого класса могут затем наследовать другие, более конкретные классы, добавляя в него свои индивидуальные особенности.

В языке C# класс, который наследуется, называется базовым , а класс, который наследует, — производным. Следовательно, производный класс представляет собой специализированный вариант базового класса. Он наследует все переменные, методы, свойства и индексаторы, определяемые в базовом классе, добавляя к ним свои собственные элементы.

 

 

Основы наследования

 

Поддержка наследования в C# состоит в том, что в объявление одного класса разрешается вводить другой класс. Для этого при объявлении производного класса указывается базовый класс. Рассмотрим для начала простой пример. Ниже приведен класс TwoDShape, содержащий ширину и высоту двухмерного объекта, например квадрата, прямоугольника, треугольника и т.д.

 

// Класс для двумерных объектов,  

class TwoDShape {

public double Width;

public double Height;

public void ShowDimO {

Console.WriteLine("Ширина и высота равны " +

Width + " и " + Height);

}

}

 

Класс TwoDShape может стать базовым, т.е. отправной точкой для создания классов, описывающих конкретные типы двумерных объектов. Например, в приведенной ниже программе класс TwoDShape служит для порождения производного класса Triangle. Обратите особое внимание на объявление класса Triangle.

 

// Пример простой иерархии классов,  

using System;

// Класс для двумерных объектов.  

class TwoDShape {

public double Width;  

public double Height;  

 

public void ShowDim() {

Console.WriteLine("Ширина и высота равны " +

Width + " и " + Height);

}

}

 

// Класс Triangle, производный от класса TwoDShape.  

class Triangle : TwoDShape {


Дата добавления: 2019-02-12; просмотров: 251; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!