- •Основные положения объектно-ориентированного программирования. Технология объектно-ориентированного программирования: назначение и применение.
- •Основные парадигмы объектно-ориентированного программирования: абстракция.
- •Основные парадигмы объектно-ориентированного программирования: инкапсуляция. Доступ к элементам класса (public, protected, private).
- •Основные парадигмы объектно-ориентированного программирования: полиморфизм.
- •Пространство имен: назначение и применение.
- •Структура класса: члены класса, свойства (элементы), методы, конструкторы и деструкторы, ссылка на себя (this).
- •Управление доступом к членам класса.
- •Конструкторы класса: по умолчанию, с аргументами, копирующие.
- •Перегружаемые методы класса.
- •Статические члены класса: назначение и применение.
- •Константные члены класса: константные свойства, константные методы.
- •Обработка исключений (try/catch/throw-конструкция).
- •Вложенные объекты.
- •Вложенные классы.
- •Принципы преобразования типов.
- •Виртуальные функции.
- •Абстрактные классы.
- •Перегружаемые операторы: бинарные, унарные, префиксные, постфиксные.
- •Спецификация cli. Структура .Net Framework.
- •С#: пространства имен, структура класса, свойства.
Пространство имен: назначение и применение.
Пространство имен определяет декларативную область, которая позволяет отдельно
хранить множества имен. По существу, имена, объявленные в одном пространстве
имен, не будут конфликтовать с такими же именами, объявленными в другом. Биб-
лиотека .NET Framework (которая является С#-библиотекой) использует пространство
имен System. Поэтому в начало каждой программы мы включали следующую инструкцию:
using System; Пространство имен объявляется с помощью ключевого слова namespace. Общая
форма объявления пространства имен имеет следующий вид:
namespace имя {
// Члены }
Все, что определено внутри
пространства имен, находится в пределах его области видимости. Следовательно, про-
странство имен определяет область видимости. Внутри пространства имен можно
объявлять классы, структуры, делегаты, перечисления, интерфейсы или другое про-
странство имен. Основное преимущество использования пространств имен состоит в том, что име-
на, объявленные внутри одного из них, не конфликтуют с такими же именами, объ-
явленными вне его. использование одного
пространства имен не аннулирует другое. При объявлении действующим некоторого
пространства имен его имя просто добавляется к именам других, которые действуют в
данный момент. Если для программы не объявлено пространство имен, используется пространство
имен, действующее по умолчанию. Главная причина инкапсуляции программного кода внутри
пространства имен состоит в предотвращении конфликтов при совпадении имен.
Пространства имен — это еще один инструмент, позволяющий программисту так ор-
ганизовать свои программы, чтобы они не теряли жизнеспособности в сложной среде
с сетевой структурой.
Структура класса: члены класса, свойства (элементы), методы, конструкторы и деструкторы, ссылка на себя (this).
Класс — это шаблон, который определяет форму объекта. Он
задает как данные, так и код, который оперирует этими данными. С# использует спе-
цификацию класса для создания объекта. Объекты — это экземпляры класса. Таким
образом, класс — это множество намерений (планов), определяющих, как должен
быть построен объект. Важно четко понимать следующее: класс — это логическая аб-
стракция. О ее реализации нет смысла говорить до тех пор, пока не создан объект
класса, и в памяти не появилось физическое его представление.
И еще. Вспомните, что методы и переменные, составляющие класс, называются
членами класса. Данные содержатся в переменных экземпляров, определяемых классом, а код — в
методах. Однако важно с самого начала отметить, что класс определяет также ряд
специальных членов данных и методов-членов, например статические переменные,
константы, конструкторы, деструкторы, индексаторы, события, операторы и свойства. Класс создается с помощью ключевого слова class. Общая форма определения
класса, который содержит только переменные экземпляров и методы, имеет следую-
щий вид:
class имя_класса {
II Объявление переменных экземпляров.
доступ тип переменная!;
доступ тип переменная2;
//. . .
доступ тип переменнаяЫ;
II Объявление методов.
доступ тип_возврата метод 1 (параметры) {
II тело метода
доступ тип_возврата метод2{параметры) {
// тело метода
доступ тип_возврата методы {параметры) {
/I тело метода
Здесь элемент доступ означает спецификатор досту-
па (например, public), который определяет, как к этому члену можно получить дос-
туп. Спецификатор доступа необязателен, и, если он не указан, подразумева-
ется, что этот член закрыт (private). Члены с закрытым доступом (закрытые члены)
могут использоваться только другими членами своего класса. Мето-
ды — это процедуры (подпрограммы), которые манипулируют данными, определен-
ными в классе, и во многих случаях обеспечивают доступ к этим данным. Обычно
различные части программы взаимодействуют с классом посредством его методов.
Любой метод содержит одну или несколько инструкций. Каждый метод имеет имя, и именно это
имя используется для его вызова. Имена методов в тексте этой книги сопровождаются парой круглых скобок Формат записи метода такой:
доступ тип_возврата имя(список_параметров) {
// тело метода
}
С помощью элемента тип_возврата указывается тип значения, возвращаемого
методом. Конструктор инициализирует объект при его создании. Он имеет такое же имя,
что и сам класс, а синтаксически подобен методу. Однако в определении конструкто-
ров не указывается тип возвращаемого значения. Формат записи конструктора такой:
доступ имя_класса{) {
// тело конструктора
Обычно конструктор используется, чтобы придать переменным экземпляра, опре-
деленным в классе, начальные значения или выполнить исходные действия, необхо-
димые для создания полностью сформированного объекта. Кроме того, обычно в ка-
честве элемента доступ используется модификатор доступа public, поскольку конст-
рукторы, как правило, вызываются вне их класса. Средства языка С# позволяют определить метод, который должен вызываться непосредственно перед тем, как объект будет окончательно разрушен системой сбора
мусора. Этот метод называется деструктором, и его можно использовать для обеспе-
чения гарантии "чистоты" ликвидации объекта. Например, вы могли бы использовать
деструктор для гарантированного закрытия файла, открытого некоторым объектом.
Формат записи деструктора такой:
~имя_класса() {
// код деструктора
}
Чтобы добавить деструктор в класс, достаточно включить его как член. Он вызыва-
ется в момент, предшествующий процессу утилизации объекта. В теле деструктора вы
указываете действия, которые, по вашему мнению, должны быть выполнены перед
разрушением объекта. В заключение стоит представить ключевое слово t h i s . При. вызове метода ему ав-
томатически передается неявно заданный аргумент, который представляет собой
ссылку на вызывающий объект (т.е. объект, для которого вызывается метод). Эта
ссылка и называется ключевым словом t h i s . На-
пример, синтаксис С# допускает, чтобы имя параметра или локальной переменной
совпадало с именем переменной экземпляра. В этом случае локальное имя будет
скрывать переменную экземпляра. И тогда доступ к скрытой переменной экземпляра
можно получить с помощью ссылки this.
Свойство — это второй специальный тип членов класса, о котором мы собирались
поговорить в этой главе. Свойство включает поле и методы доступа к этому полю.
Часто требуется создать поле, которое должно быть доступно для пользователей объекта,
но программист при этом хочет осуществлять управление операциями, разрешенными к
выполнению над этим полем. Например, по некоторым обстоятельствам вы желаете ог-
раничить диапазон значений, которые можно присваивать этому полю. Свойства во многом напоминают индексаторы. Свойство состоит из имени и пары
аксессоров (get и set). Аксессоры используются для чтения содержимого перемен-
ной и записи в нее нового значения. Основное достоинство свойства состоит в том,
что его имя можно использовать в выражениях и инструкциях присваивания подобно
обычной переменной, хотя в действительности здесь будут автоматически вызываться
get- и set-аксессоры. Формат записи свойства таков:
ТИП ИМЯ{
get{
// код аксессора чтения поля
}
set{
// код аксессора записи поля
} На использование свойств налагаются довольно серьезные ограничения. Во-
первых, поскольку в свойстве не определяется область памяти, его нельзя передавать
методу в качестве ref- или out-параметра. Во-вторых, свойство нельзя перегружать.
(Но при необходимости вы можете иметь два различных свойства, которые исполь-
зуют одну и ту же базовую переменную, но к такой организации свойств прибегают
нечасто.) Наконец, свойство не должно изменять состояние базовой переменной при
вызове get-аксессора, хотя несоблюдение этого правила компилятор обнаружить не в
состоянии. Другими словами, get-операция должна быть максимально простой.