Чтение онлайн

на главную

Жанры

Полное руководство. С# 4.0
Шрифт:

При выполнении этого кода получается следующий результат. Длина массива ra: 11 Содержимое массива ra: -5 -4 -3 -2 -1 0 1 2 3 4 5 Длина массива ra2: 10 Содержимое массива ra2: 1 2 3 4 5 6 7 8 9 10 Длина массива ra3: 9 Содержимое массива ra2: -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 ShowDim { 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 { public string Style; // тип треугольника // Возвратить площадь треугольника. public double Area { return Width * Height / 2; } // Показать тип треугольника. public void ShowStyle { Console.WriteLine("Треугольник " + Style); } } class Shapes { static void Main { Triangle t1 = new Triangle; Triangle t2 = new Triangle; t1.Width = 4.0; t1.Height = 4.0; t1.Style = "равнобедренный"; t2.Width = 8.0; t2.Height = 12.0; t2.Style = "прямоугольный"; Console.WriteLine("Сведения об объекте t1: "); t1.ShowStyle; t1.ShowDim; Console.WriteLine("Площадь равна " + t1.Area); Console.WriteLine; Console.WriteLine("Сведения об объекте t2: "); t2.ShowStyle; t2.ShowDim; Console.WriteLine("Площадь равна " + t2.Area); } }

При выполнении этой программы получается следующий результат. Сведения об объекте t1: Треугольник равнобедренный Ширина и высота равны 4 и 4 Площадь равна 8 Сведения об объекте t2: Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48

В классе Triangle создается особый тип объекта класса TwoDShape (в данном слу чае — треугольник). Кроме того, в класс Triangle входят все члены класса TwoDShape, к которым, в частности, добавляются методы Area и ShowStyle. Так, описание типа треугольника сохраняется в переменной Style, метод Area рассчитывает и воз вращает площадь треугольника, а метод ShowStyle отображает тип треугольника. Обратите внимание на синтаксис, используемый в классе Triangle для наследова ния класса TwoDShape. class Triangle : TwoDShape {

Этот синтаксис может быть обобщен. Всякий раз, когда один класс наследует от другого, после имени базового класса указывается имя производного класса, отделяе мое двоеточием. В C# синтаксис наследования класса удивительно прост и удобен в ис пользовании.

В класс Triangle входят все члены его базового класса TwoDShape, и поэтому в нем переменные Width и Height доступны для метода Area. Кроме того, объекты t1 и t2 в методе Main могут обращаться непосредственно к переменным Width и Height, как будто они являются членами класса Triangle. На рис. 11.1 схематически показано, каким образом класс TwoDShape вводится в класс Triangle.

Поделиться:
Популярные книги

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Наследник с Меткой Охотника

Тарс Элиан
1. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник с Меткой Охотника

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

"Фантастика 2023-123". Компиляция. Книги 1-25

Харников Александр Петрович
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Фантастика 2023-123. Компиляция. Книги 1-25

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Береги честь смолоду

Вяч Павел
1. Порог Хирург
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Береги честь смолоду

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Вечная Война. Книга VI

Винокуров Юрий
6. Вечная Война
Фантастика:
боевая фантастика
рпг
7.24
рейтинг книги
Вечная Война. Книга VI

Неожиданный наследник

Яманов Александр
1. Царь Иоанн Кровавый
Приключения:
исторические приключения
5.00
рейтинг книги
Неожиданный наследник

Аномальный наследник. Том 1 и Том 2

Тарс Элиан
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Аномальный наследник. Том 1 и Том 2

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10