
- •5. Объекты и их жизненный цикл. Создание и уничтожение объектов. Алгоритм реализации в .Net освобождения памяти.
- •6. Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.
- •8. Инкапсуляция. Скрытие членов класса.
- •15. Перегрузка методов. Функциональное назначение. Способ реализации. Примеры применения.
- •16. Виртуальные методы. Функциональное назначение. Примеры применения.
- •17. Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.
- •18. Управление областями видимости членов класса. Функциональное назначение. Способ реализации. Примеры применения.
- •Вопрос 19.
- •Вопрос 20
- •Вопрос 21
1. Объектно-ориентированное программирование как идеология программирования и как технология. Достоинства и недостатки.
Идеология
Объектно-ориентированное программирование или событийно-управляемое программирование – программирование, направленное на объекты. Объект – это все то, что нас окружает, и с чем мы можем взаимодействовать. Объекты могут быть информационными и материальными.
В программировании мы имеем дело с созданием моделей информационного типа, отражающих (описывающих) свойства и поведение некоторых реальных объектов. В визуальном объектно-ориентированном программировании в качестве объектов могут выступать и объекты самого языка.
В каждый момент времени объект характеризуется присущим именно ему набором свойств и методов – операций, совершаемых над другими объектами или данным объектом, а также реагирует на события.
Если взять набор объектов, как правило, одного и того же типа, хотя и не обязательно, то мы получим семейство или коллекцию, которая в свою очередь, тоже является объектом. Чтобы обращаться к элементам коллекции, каждому объекту присваивается уникальное имя или номер.
Способность реагировать на определенные события – это разновидность свойства. При возникновении события производится его обработка. Объекты, используемые в компьютерных программах, реагируют на события. При возникновении события происходит автоматический запуск специального метода – обработчика данного события. С помощью событий обеспечивается взаимодействие программы с пользователем. События, связанные с действиями пользователя, называются пользовательскими. Кроме пользовательских событий в программах происходят программные события.
Объединение в объекте его свойств и методов называют инкапсуляцией. Инкапсуляция означает, что объект инкапсулирует (содержит) в себе свойства и методы, но описывать мы ничего не должны. Под термином «инкапсуляция» подразумевается то, что мы работаем (взаимодействуем) с объектом, совершенно не зная об его устройстве. Синонимом инкапсуляции может служить термин «сокрытие информации» о конструкции объекта. Итак, объект можно определить как продукт инкапсуляции данных вместе с кодом, предназначенным для их обработки.
Достоинства
Дает огромные преимущества и значительно облегчает программирование. Оно позволяет не только экономить время при создании новых классов, но и дает возможность неограниченного расширения и совершенствования уже существующих классов. Можно придать новые функции классу, даже не зная деталей реализации самого объекта класса.
Недостатки
Динамическое связывание методов.
Обеспечение полиморфного поведения объектов приводит к необходимости связывать методы, вызываемые программой (то есть определять, какой конкретно метод будет вызываться) не на этапе компиляции, а в процессе исполнения программы, на что тратится дополнительное время. При этом реально динамическое связывание требуется не более чем для 20 % вызовов, но некоторые ООП-языки используют его постоянно.
Значительная глубина абстракции.
ООП-разработка часто приводит к созданию «многослойных» приложений, где выполнение объектом требуемого действия сводится к множеству обращений к объектам более низкого уровня. В таком приложении происходит очень много вызовов методов и возвратов из методов, что, естественно, сказывается на производительности.
Наследование «размывает» код.
Код, относящийся к «оконечным» классам иерархии наследования (которые обычно и используются программой непосредственно) — находится не только в самих этих классах, но и в их классах-предках. Относящиеся к одному классу методы фактически описываются в разных классах. Это приводит к двум неприятным моментам:
Снижается скорость трансляции, так как компоновщику приходится подгружать описания всех классов иерархии.
Снижается производительность программы в системе со страничной памятью — поскольку методы одного класса физически находятся в разных местах кода, далеко друг от друга, при работе фрагментов программы, активно обращающихся к унаследованным методам, система вынуждена производить частые переключения страниц.
Инкапсуляция снижает скорость доступа к данным.
Запрет на прямой доступ к полям класса извне приводит к необходимости создания и использования методов доступа. И написание, и компиляция, и исполнение методов доступа сопряжено с дополнительными расходами.
Динамическое создание и уничтожение объектов.
Динамически создаваемые объекты, как правило, размещаются в куче, что менее эффективно, чем размещение их на стеке и, тем более, статическое выделение памяти под них на этапе компиляции.
Технология
Целью изучения настоящей дисциплины является выработка навыков и умений разрабатывать программное обеспечение (ПО), обладающие высокими показателями качества. Задачей курса является изучение средств и технологических приемов для обеспечения следующих внешних показателей качества:
Функциональность (множество возможностей, обеспечиваемых ПО),
Корректность (способность ПО точно выполнять задачи, определенные спецификацией),
Устойчивость (способность соответствующим образом реагировать на аварийные ситуации),
Совместимость (простота сочетания с другими компонентами),
Эффективность (слабая зависимость от ресурсов: процессорного времени, пространства, занимаемого во внутренней и внешней памяти, пропускной способности устройств связи),
Безопасность (способность ПО защищать свои программы и данные от несанкционированного доступа и модификации).
Простота использования, установки и сопровождения.
Важной задачей является изучение средств и приемов, обеспечивающих внутренние показатели качества:
Высокая степень повторного использования элементов ПО,
Расширяемость (простота адаптации к изменениям в спецификации),
Переносимость в различные программные платформы,
Наличие внутренней документации, дающей разработчикам ПО возможность понять структуру и особенности реализации системы.
2. Основные понятия объектно-ориентированного программирования-класс, объект, поле, метод, свойство.
Класс
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса. При этом в некоторых исполняющих системах класс также может представляться некоторым объектом при выполнении программы посредством динамической идентификации типа данных. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.
Объект
Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и связывания исходного кода на выполнение).
Поле
Поля – это данные, уникальные для каждого экземпляра класса. Они предназначены для хранения данных во время работы экземпляра класса (объекта). Поле объявляется как обычная переменная и может быть любого типа. В описании класса поля должны предшествовать методам и свойствам.
Для защиты полей целесообразно объявлять их в защищённом разделе (например, в Private).
При создании новых классов на базе ранее созданных класс-потомок наследует все поля класса-родителя. Удаление и переопределение полей невозможно. Допускается добавление новых полей.
Поля и методы у разных объектов одного типа одни и те же.
Метод
Метод – это подпрограмма (процедура или функция), которая определена как элемент класса. Описание метода аналогично описанию обычной подпрограммы модуля. Внутри одного класса можно объявить столько методов, сколько надо.
Концепция ООП базируется на трёх основных принципах:
- инкапсуляция;
- полиморфизм;
- наследование.
Свойство
Свойства – это высокоуровневые атрибуты компонентов класса.
В объектах Delphi пользователь полностью отгорожен от полей объекта с помощью свойств. Внешне свойства напоминают поля, но внутри содержат методы, обеспечивающие доступ к свойствам. При каждом обращении к такому методу выполняются соответствующие действия, т.е. к свойствам класса доступ возможен только через методы.
Каждому свойству соответствует поле, содержащее значение свойства, и два метода, обеспечивающих доступ к значению поля.
3. Класс. Синтаксис объявления класса. Члены класса. Ссылка на созданный объект класса.
Класс
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса. При этом в некоторых исполняющих системах класс также может представляться некоторым объектом при выполнении программы посредством динамической идентификации типа данных. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.
Синтаксис объявления класса
Синтаксис объявления класса подобен синтаксису объявления структуры. Объявление начинается с ключевого слова class, за которым следует имя класса.
Члены класса
Классы могут содержать следующие типы участников:
Функции элементов.
элементы данных.
Перечисления.
Битовые поля.
Друзья.
Имена типов.
Ссылка на созданный объект класса
?
4. Конструкторы и деструкторы. Функциональное назначение. Виды конструкторов.
Конструктор
Конструктор- специальный блок инструкций, вызываемый при создании объекта.
Конструктор схож с методом, но отличается от метода тем, что не имеет явным образом определённого типа возвращаемых данных, не наследуется, и обычно имеет различные правила для рассматриваемых модификаторов. Конструкторы часто выделяются наличием одинакового имени с именем класса, в котором объявляется. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в «правильном» состоянии. Неизменяемые объекты тоже должны быть проинициализированы конструктором.
Основное назначение конструктора - инициализация объекта. В соответствии с синтаксисом языка для конструктора не определен тип возвращаемого значения, даже тип void не допустим. С помощью параметров конструктору может быть переданы любые данные, необходимые для создания и инициализации объектов класса.
Некоторые языки программирования различают несколько особых типов конструкторов:
конструктор по умолчанию — конструктор, не принимающий аргументов;
конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него);
конструктор преобразования — конструктор, принимающий один аргумент (эти конструкторы могут вызываться автоматически для преобразования значений других типов в объекты данного класса).
Деструктор
Динамическое выделение памяти для объекта какого-либо класса создает необходимость в освобождении этой памяти при уничтожении объекта. Желательно, чтобы освобождение памяти происходило автоматически, а не требовало вмешательства программиста. Такую возможность предоставляет деструктор:
~имя_класса()
{ операторы тела деструктора };
Деструктор не имеет возвращаемого значения. Любой метод - это операция, но не любая операция - метод, так как могут иметь место общедоступные процедуры.
Совокупность всех методов и общедоступных процедур, относящихся к конкретному объекту, образует протокол этого объекта. Протокол объекта, таким образом, определяет оболочку поведения объекта, охватывающую его внутреннее статическое и внешнее динамическое поведение.
5. Объекты и их жизненный цикл. Создание и уничтожение объектов. Алгоритм реализации в .Net освобождения памяти.
Объект и их жизненный цикл.
Объект-Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и связывания исходного кода на выполнение).
Обычно объекты в ООП-программе имеют непредсказуемое время жизни. Это означает, что они создаются и уничтожаются в случайном порядке. Программист не всегда может предсказать, на какой стадии жизненного цикла существуют взаимодействующие объекты. Таким образом, нам нужен механизм управления жизненным циклом объекта и памятью.
Создание и уничтожение объектов.
Рассмотрим создание объектов. Можно создать ссылку, которая не будет объектом и будет способна только ссылаться на объект, как на обычную переменную, указав в качестве типа имя класса. Этой ссылке необходимо сопоставить объект, который можно создать с помощью оператора new.
После оператора new ставится имя класса, а в скобках — параметры, если они имеются у конструктора (о конструкторе чуть позднее). Если конструктора нет, то в скобках параметры не указывают.
В языке С++ объект нужно уничтожать с помощью оператора delete. В языке Java операторы delete нет, а "сборку мусора" обеспечивает виртуальная машина Java (JVM). Если перестать использовать объект в программе, то автоматически удаляется ссылка на него.
Алгоритм реализации в .Net освобождения памяти.
?
6. Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.
Инкапсуляция.
Инкапсуляция (encapsulation) - это механизм, который объединяет данные и код, манипулирующий зтими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый "чёрный ящик". Когда коды и данные объединяются таким способом, создаётся объект (object). Другими словами, объект - это то, что поддерживает инкапсуляцию.
Свойства.
Изюминка здесь в том, при инкапсуляции есть возможность изменить реализацию объекта (изменить алгоритм методов или свойств), не меняя интерфейс объекта. Изменения в интерфейсе объекта могли бы оказать влияние на работоспособность целых библиотек программного кода, но благодаря свойству инкапсуляции нам необязательно трогать интерфейс объекта.
Создание индексатора
Индексаторы c# обеспечивают естественный синтаксис для доступа к элементам в классах или структурах, которые инкапсулируют список или словарь значений. Индексаторы являются подобными свойствам, но доступ к ним происходит с помощью аргумента индекса, а не имени свойства.
Класс string имеет индексатор, который дает вам возмоность получить доступ к каждому из символов, который содержится в строке с помощью индекса типа Int
1.string s = "hello";
2.Console.WriteLine (s[0]); // 'h'
3.Console.WriteLine (s[3]); // 'l'