
- •Программирование на языке Visual c#
- •14. Объектно-ориентированное программирование
- •14.1. Основные принципы ооп
- •14.2. Объекты
- •14.3. Классы
- •14.4. Определение классов и их членов
- •14.4.1. Определение полей
- •14.4.2. Определение свойств
- •14.4.3. Определение методов
- •14.4.4. Конструкторы
- •14.5. Статические классы и их члены
- •9.5. Члены классов
14.4.1. Определение полей
Поля объявляются с типом подобно тому, как это делается со всеми прочими переменными [5 – Неш, C# 2010 Уск. Курс для проф.]. При этом также могут использоваться модификаторы доступа.
Определение поля: (MSDN_ООП_VB+C#_2010)
Class SampleClass
{ public string sampleField;
}
Во время создания объекта поля можно инициализировать, используя для этого различные способы. Простейший способ сделать это – прибегнуть к помощи инициализаторов. Они задаются в точке определения поля и могут применяться как для статических полей, так и для полей экземпляра, например:
private int х = 789; // Инициализация с помощью константы
private int z = A.InitZ(); // Инициализация с помощью метода
Следует обратить внимание, что эта инициализация происходит во время выполнения, а не во время компиляции. Поэтому при инициализации могут использоваться не только константы. Например, переменная z инициализируется вызовом метода A.InitZ() . Поначалу такое обозначение инициализации поля может показаться значительным сокращением, избавляющим от необходимости инициализировать все поля внутри тела конструктора. Однако для объявлений сложных типов все-таки рекомендуется инициализировать поля экземпляра внутри тела конструктора экземпляра.
14.4.2. Определение свойств
Свойства – один из самых замечательных механизмов С# и CLR, который позволяет достичь лучшей инкапсуляции. Если говорить коротко, то свойства используются для ужесточения контроля доступа к внутреннему состоянию объекта.
С точки зрения клиента объекта свойство выглядит и ведет себя аналогично общедоступному полю. Доступ к свойству организован так же, как и доступ к общедоступному полю экземпляра класса. Однако свойство не имеет никакого ассоциированного с ним места хранения в объекте, как это присуще полю. Вместо этого свойство предоставляет средства доступа для чтения и записи поля. Типичный шаблон предусматривает обеспечение доступа к приватному полю класса через общедоступное свойство.
Синтаксис определения свойства очень прост. Для его реализации нужно определить поле для хранения значения свойства, а затем реализовать базовую логику для хранения и извлечения этого значения соответственно в блоках set и get, например:
class SampleClass
{ private int sample; // Определение поля
public int Sample // Определение свойства
{ get
{ return sample; // Возвращение значения, сохраненного в поле
}
set
{ sample = value; // Сохранение значения в поле
}
}
}
Блок get вызывается, когда клиент объекта читает свойство, и обеспечивает возвращение значения поля, соответствующего свойству.
Блок set вызывается, когда клиент объекта пытается записать свойство. Обратите внимание, что в этом блоке нет возвращаемого значения, но есть специальная переменная value, которая доступна коду внутри этого блока и имеет тот же тип, что объявлен в качестве типа свойства. При записи значения в свойство именно через переменную value передается значение, которое клиент пытается присвоить свойству. При попытке объявить локальную переменную по имени value в блоке set, будет получена ошибка компиляции.
Пример 14.1. Определение класса T со свойством Temperature, которое просто возвращает или изменяет значение приватного поля temperature из внутреннего состояния экземпляра объекта. Затем создается объект (objT, экземпляр класса T), изменяется в нем значение указанного свойства и выводится на экран это значение.
using System;
public class T // Определение класса
{ private int temp; // Определение поля
public int Temperature // Определение свойства
{ get
{ Console.WriteLine("Извлечение значения temp.");
return temp; // Возврат значения, хранимого в поле
}
set
{ Console.WriteLine("Установка значения temp.");
temp = value; // Сохранение значения в поле
}
}
}
public class MainClass
{ static void Main() // Точка входа в программу
{ T objT = new T(); // Создание экземпляра класса (объекта)
objT.Temperature = 20; // Изменение значения свойства
Console.WriteLine("T = {0}", objT.Temperature);
// Вывод значения температуры (свойства)
Console.ReadLine(); // Ожидание нажатия клавиши <Enter>
}
}
/* Вывод:
Установка значения temp.
Извлечение значения temp.
T = 20
*/
В процессе создания экземпляра класса свойствам можно назначить исходные значения, для этого могут использоваться инициализаторы объектов:
// Установка значений свойств
SampleClass sampleObject = new SampleClass
{ FirstProperty = "A", SecondProperty = "B" };
Свойства, доступные только для чтения и только для записи.
Как было показано выше, у большинства свойств имеются блоки, как для задания, так и для возврата значения свойства. Однако можно создать свойства, доступные только для чтения или только для записи. Для этого в C# нужно опустить в свойстве блок set или get, а в Visual Basic нужно использовать ключевые слова ReadOnly и WriteOnly.
Если свойство определяется только с блоком get, то такое свойство будет доступно только для чтения, а если только с блоком set, то свойство будет доступно только для записи.