
- •Дополнительные члены класса
- •Примечание 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. Индексатор только для чтения, несвязанный с массивом,
- •Программа напечатает:
- •Вложенные типы

Файл Class1.cs:
using System;
namespace ConsoleApplication2
{
class Class1
{
static void Main(string[ ] args)
{
ClassDate myDate = new ClassDate();
Console.WriteLine("default date: " +
myDate.GetMonth()+" "+myDate.GetYear());
ClassDate demoDate = new ClassDate (4, 2014);
12

Console.WriteLine("demo date: " + demoDate.GetMonth()+" " +demoDate.GetYear());
ClassDate sumDate;
int m=13;
sumDate = myDate+demoDate;
Console.WriteLine("sum date: " + sumDate.GetMonth()+" " +sumDate.GetYear());
sumDate = myDate+m;
Console.WriteLine("sum date: " + sumDate.GetMonth()+" " +sumDate.GetYear());
sumDate = m+myDate;
Console.WriteLine("sum date: " + sumDate.GetMonth()+" " +sumDate.GetYear());
}
}
}
13

Свойства
Это особая характеристика, позволяющая скрыть за простым синтаксисом обращение к методам объекта.
В соответствии с принципом инкапсуляции переменные экземпляра должны быть закрыты – их объявляют с уровнем доступа private.
Для считывания и изменения этих переменных используются специальные методы get и set, соответственно называемые
аксессор (англ. access – доступ)
мутатор (англ. mutation – изменение).
Вместо использования этих методов применяют свойства.
В программе (вне класса) они выступают подобно переменным экземпляра (внутри класса),
в упрощенном синтаксисе их можно подставлять в выражения, присваивать им значения и т.п.
14

Синтаксис определения свойства
Определяя свойство, нужно показать,
каким методам оно соответствует.
access prop_type prop_name
{
get
{
statements
}
set
{
statements
}
}
15

access – уровень доступа (обычно выбирается public),
prop_type - тип,
prop_name - имя свойства.
Блок get должен обязательно содержать оператор
return expr, возвращающий значение свойства.
Блок set для передачи свойству значения использует предопределенный параметр value.
Правила использования свойств
Тип выражения expr должен совпадать с типом свойства prop_type.
Тип выражения, значение которого присваивается параметру value, должен совпадать с типом свойства prop_type.
16

В определении свойства могут присутствовать
оба блока или
только один из них (свойство для чтения, свойство для записи).
Свойства нельзя передавать методам в качестве параметров ref и out.
Свойство не может быть перегружено.
Свойство не должно изменять значение соответствующей ему переменной в блоке get.
17

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

Простой пример определения свойства.
class SimpleProp
{
private int xValue; // переменная экземпляра
public SimpleProp () { xValue = 0;}
public int XValue // свойство
{
get // возвращает значение переменной
{
return xValue;
}
set
//переменной можно присваивать только значения >0
{
if (value >=0) xValue = value;
}
}
}
19

Использование свойства :
class TestProp
{
public static void Main ()
{
SimpleProp obj = new SimpleProp ();
Console.WriteLine (“начальное значение: “+ obj.XValue);
obj.XValue = 1;
Console.WriteLine (“новое значение: “+ obj.XValue);
obj.XValue = -1;
Console.WriteLine (“новое значение: “+ obj.XValue);
}
}
20

Индексаторы
В С# не допускается перегрузка оператора [ ] – взятия элемента массива по заданному индексу.
Например, создан класс векторов.
в числе переменных экземпляра будет массив координат вектора,
операция индексации применима именно к этому массиву, а не сразу к объекту.
Проблему можно решить, создав индексатор.
Тогда к элементу массива, содержащемуся в объекте, можно обращаться, указывая не имя массива, а имя объекта.
Кроме того, с помощью индексатора можно создать имитацию массива.
21