Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структура программы.doc
Скачиваний:
8
Добавлен:
23.12.2018
Размер:
162.3 Кб
Скачать

Перегрузка операторов

Цель перегрузки операторов: определение новых правил выполнения существующих операций применительно к созданному пользователем классу. При этом приоритет операций не меняется. Перегрузить можно как бинарные, так и унарные операции, а также операции отношений. Для перегрузки операции необходимо в составе класса задать функцию с новыми правилами выполнения существующей операции; из наиболее известных операторов нельзя перегрузить оператор присваивания (=), а также составные операторы присваивания ( += и т.п.).

Общий формат перегрузки:

public static тип_возвращаемого_значения operator Знак_операции ( операнды )

{// текст функции перегрузки}

Индексаторы и работа с ними

Индексаторы позволяют организовать доступ к элементам одного массива в составе класса через имя класса как для получения значения элемента массива, так и для его изменения. Определение индексатора:

Тип_данных_элементов массива this [int индекс]

{get

{//возврат значения}

set

{ // присвоение значения}

}

Индексатор может иметь и атрибут доступа (по умолчанию как всегда private), индексатор public может обращаться и к массивам private.

Свойства и работа с ними

Свойства – это обобщение понятия данных. Значения свойств можно вычислить на основе значений данных, а также через свойство можно присвоить значения данным. Часто свойство вычисляют на базе нескольких или даже целого множества данных (Например, свойство треугольника -периметр - можно вычислить, зная его стороны; свойство сумма элементов массива на основе . . . ). В таком случае, естественно, вопрос о вычислении данных на основе значения свойства бессмысленный, так как эта задача не решается однозначно.

Определение свойства:

Тип_данных_свойства имя_свойства

{ get {

//получение значения свойства

}

set {

// использование переданного значения свойства

} }

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

На использование свойств налагаются довольно серьезные ограниче­ния. Свойству не соответствует поле памяти, оно лишь представляет данные. Поэтому его нельзя передавать методу в качестве ref- или out-параметра. Свойство не должно изменять состояние базовой переменной при вызове get.

Наследование. Работа с конструктором при наследовании.

В C# допускается простое наследование: каждый класс может иметь только одного предка. Используя наследование, можно создать базовый класс, который определяет характеристики, присущие множеству связанных объектов. Этот класс затем может быть унаследован другими классами с до­бавлением в каждый из них своих особенностей. Равнозначные термины: ба­зовый класс – класс наследник; родительский класс – дочерний класс; класс предок – класс наследник.

При создании экземпляра класса, имеющего предка, запускаются все конструкторы: в первую очередь конструктор базового класса и затем конструктор класса – наследника.

При наличии большего количества уровней наследования подряд будут запущены конструкторы всех уровней иерархии, начиная с базового.

Если конструкторы не имеют формальных параметров, то при этом никаких проблем не возникает: каждый конструктор независимо от других выполняет свои операторы. Осталось решить вопрос: как обеспечить передачу параметра (ов) конструктору класса – предка, в нашем случае конструктору 2. Проще всего это выполнить с помощью списка инициализации в конструкторе класса – наследника.

public proc1(int k1, int k2): base(k1)

{

q = k2;

}

Запись base(k1)означает, что конструктору базового класса в качестве фактического параметра будет передано значение к1.