
- •Дополнительные члены класса
- •Примечание 1.
- •Синтаксис определения метода-оператора
- •Правила перегрузки операторов
- •При перегрузке бинарных операторов хотя бы один из операндов должен совпадать по типу
- •Файл ClassDate.cs:
- •public ClassDate(int month, int year)
- •Файл Class1.cs:
- •Свойства
- •Синтаксис определения свойства
- •access – уровень доступа (обычно выбирается public),
- •В определении свойства могут присутствовать
- •Если свойство поставлено в
- •Простой пример определения свойства.
- •Использование свойства :
- •Индексаторы
- •НО использование индексаторов не позволяет использовать методы класса Array подобно обычным массивам.
- •Одномерные индексаторы
- •elem_type – базовый тип индексатора:
- •access elem_type this [form_param_list]
- •Пример 1. Индексатор, контролирующий доступ к массиву. Для сокращения кода переменные len и
- •public int this [int index]
- •Использование индексатора:
- •Программа напечатает:
- •Пример 2. Индексатор только для чтения, несвязанный с массивом,
- •Программа напечатает:
- •Вложенные типы

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

+ - ! ++ --
Перегружаемые унарные операторы.
+ - * / % & | ^ << >>
Перегружаемые бинарные операторы.
== != < > <= >=
Перегружаемые операторы сравнения
&& ||
Неперегружаемые логические операторы, но вместо них можно использовать перегружаемые & и |.
2

[ ]
Вместо этого неперегружаемого оператора используются индексаторы.
()
Неперегружаемый оператор
Неперегружаемые составные операторы присваивания.
Но если перегружен входящий в них оператор, например, +, то оператор += будет использовать именно перегруженный +,
= . ?: new is sizeof typeof
Неперегружаемые операторы.
3

Примечание 1.
Если требуется перегрузить
оператор сравнения,
то нужно предусмотреть также
перегрузку парного к нему оператора:
==и != ,
<и >, <= и >=.
Примечание 2.
Перегруженные операторы ++ и - -
изменяют значение операнда
(в отличие от прочих операторов).
4

Синтаксис определения метода-оператора
унарный
public static ret_type operator op (par_type par_name)
{
statements
}
бинарный
public static ret_type operator op (par_type1 par_name1, par_type2 par_name2)
{
statements
}
ret_type – тип возвращаемого значения,
op - символьное обозначение перегружаемого оператора,
par_type - тип,
par_name - имя формального параметра.
5

Правила перегрузки операторов
Невозможно изменить
приоритет выполнения оператора,
количество операндов.
Тип возвращаемого значения не может быть void.
Поэтому в теле метода – оператора обязательно должен быть оператор return.
При перегрузке унарных операторов операнд должен совпадать по типу с классом, для которого перегружен данный оператор.
6

При перегрузке бинарных операторов хотя бы один из операндов должен совпадать по типу с классом, для которого перегружен данный оператор.
В объявлении перегружаемого оператора нельзя использовать для формальных параметров модификаторы ref и out.
Действие перегруженного оператора должно соответствовать действию исходного,
например, операторы сравнения должны возвращать значение типа bool.
Прочие операторы, как правило, возвращают значение, совпадающее по типу с тем классом, для которого перегружен данный оператор.
7

Файл ClassDate.cs:
using System;
namespace ConsoleApplication2
{
public class ClassDate
{
private int month;
private int year;
const int InitMonth = 1;
const int InitYear = 2014;
public ClassDate()
{
this.month = InitMonth;
this.year = InitYear;
}
8

public ClassDate(int month, int year)
{
this.month = month;
this.year = year;
}
public int GetMonth()
{
return month;
}
public int GetYear()
{
return year;
}
9

public static ClassDate operator + (ClassDate d1,
ClassDate d2)
{
ClassDate result = new ClassDate();
result.month = (d1.month+d2.month)%12;
result.year = d1.year+ d2.year+ (int)(d1.month+
d2.month)/12;
return result;
}
10

public static ClassDate operator +(ClassDate d1, int m)
{
ClassDate result = new ClassDate();
result.month = (d1.month+m)%12;
result.year = d1.year+(int)(d1.month+m)/12;
return result;
}
public static ClassDate operator+ (int m, ClassDate d1)
{
ClassDate result = new ClassDate();
result.month = (d1.month+m)%12;
result.year = d1.year+(int)(d1.month+m)/12;
return result;
}
}
}
11