
- •С# и объектно-ориентированное программирование. Содержание
- •Разбор простой программы на с#.
- •Варианты метода Main ()
- •Формальное определение класса в с#
- •2.1Ссылки на самого себя
- •Построение цепочки вызовов конструкторов с использованием this.
- •Модификаторы доступа с#
- •Средства инкапсуляции с#
- •Инкапсуляция с использованием традиционных методов доступа и изменения
- •Инкапсуляция с использованием свойств .Net
- •Свойства, доступные только для чтения и только для записи
- •Статические свойства
- •Статические конструкторы
- •Наследование в с#
- •Работа с конструктором базового класса
- •Множественное наследование.
- •Ключевое слово sealed
- •Поддержка полиморфизма в с#
- •Ключевые слова virtual и override
- •Абстрактные классы
- •Полиморфный интерфейс
- •Сокрытие методов
- •Правила приведения к базовому и производному классу
- •Ключевое слово as
- •Ключевое слово is
- •Применение модели включения – делегирования.
- •Определение вложенных типов
- •Обработка исключений
- •Роль обработки исключений в .Net
- •Составляющие процесса обработки исключений в .Net
- •Генерация общего исключения
- •Перехват исключений
- •Создание специальных исключений, способ первый
- •Обработка нескольких исключений.
- •Блок finally
- •Замечания по работе с исключениями
- •Время жизни объектов
- •Базовые сведения о времени жизни объектов
- •Роль корневых элементов приложения
- •Поколения объектов
- •Параллельная сборка мусора в версиях .Net 1.0 - .Net 3.5
- •Фоновая сборка мусора в версии .Net 4.0
- •Создание финализируемых объектов
- •Описание процесса финализации
- •Создание высвобождаемых объектов
- •Повторное использование ключевого слова using в с#
- •Взаимодействие со сборщиком мусора
- •Принудительная активизация сборки мусора
- •Создание финализируемых и высвобождаемых типов
- •Формализованный шаблон очистки
Средства инкапсуляции с#
Концепция инкапсуляции вращается вокруг принципа, гласящего, что внутренние данные объекта не должны быть напрямую доступны через экземпляр объекта.
С идеей инкапсуляции программной логики тесно связана идея защиты данных.
В идеале данные состояния объекта должны быть специфицированы с использованием ключевого слова private (или, возможно, protected). Таким образом, внешний мир должен вежливо попросить, если захочет изменить или получить лежащее в основе значение. Это хороший принцип, поскольку общедоступные элементы данных можно легко повредить (даже нечаянно, а не преднамеренно).
Инкапсуляция с использованием традиционных методов доступа и изменения
Рассмотрим класс Employee. Если необходимо, чтобы внешний мир мог взаимодействовать с полным именем сотрудника, по традиции понадобится определить методы доступа (метод get) и изменения (метод set). Роль метода get состоит в возврате вызывающему коду значения лежащих в основе статических данных. Метод set позволяет вызывающему коду изменять текущее значение лежащих в основе статических данных при условии соблюдения бизнес-правил.
Для целей иллюстрации инкапсулируем поле fullName. Для этого к существующему классу Employee следует добавить показанные ниже общедоступные члены. Обратите внимание, что метод SetName() выполняет проверку входящих данных, чтобы удостовериться, что строка имеет длину не более 15 символов. Если это не так, на консоль выводится сообщение об ошибке и происходит возврат без изменения значения поля fullName.
(этот код вставляем в проект EmployeeExample, класс Employee)
Задание!!!: протестировать, исправить возможные ошибки
Эта техника требует наличия двух уникально именованных методов для управления единственным элементом данных. Для иллюстрации модифицируем метод Main() следующим образом:
(этот код вставляем в проект EmployeeExample, метод Main)
Задание!!!: протестировать, исправить возможные ошибки
Благодаря коду в методе SetName(), попытка присвоить строку длиннее 15 символов приводит к выводу на консоль жестко закодированного сообщения об ошибке.
Инкапсуляция с использованием свойств .Net
Вдобавок к возможности инкапсуляции полей данных с использованием традиционной пары методов get/set, в языках .NET имеется более предпочтительный способ инкапсуляции данных с помощью свойств. Прежде всего, имейте в виду, что свойства — это всего лишь упрощенное представление "реальных" методов доступа и изменения.
Это значит, что разработчик класса по-прежнему может реализовать любую внутреннюю логику, которую нужно выполнить перед присваиванием значения. Ниже приведен измененный класс Employee, который теперь обеспечивает инкапсуляцию каждого поля с применением синтаксиса свойств вместо традиционных методов get/set.
(этот код вставляем в проект EmployeeExample, класс Employee)
Задание!!!: протестировать, исправить возможные ошибки
Свойство С# состоит из определений контекстов чтения get (метод доступа) и set (метод изменения), вложенных непосредственно в контекст самого свойства.
Cвойство указывает тип данных, которые оно инкапсулирует, как тип возвращаемого значения. Кроме того, в отличие от метода, в определении свойства не используются скобки (даже пустые).
В контексте set свойства используется лексема value, которая представляет входное значение, присваиваемое свойству вызывающим кодом. Эта лексема не является настоящим ключевым словом С#, а представляет собой то, что называется контекстуальным ключевым словом. Когда лексема value находится внутри контекста set, она всегда обозначает значение, присваиваемое вызывающим кодом, и всегда имеет тип, совпадающий с типом самого свойства.
При наличии этих свойств вызывающему коду кажется, что он имеет дело с общедоступным элементом данных; однако "за кулисами" при каждом обращении вызывается корректный get или set, обеспечивая инкапсуляцию:
(этот код вставляем в проект EmployeeExample, метод Main )
Задание!!!: протестировать, исправить возможные ошибки