Информатика и программирование: объектно-ориентированное программирование (на основе языка С#)
Покупка
Тематика:
Программирование на C и C++
Издательство:
Издательский Дом НИТУ «МИСиС»
Год издания: 2015
Кол-во страниц: 309
Дополнительно
Вид издания:
Учебник
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-87623-801-6
Артикул: 753042.01.99
Объектно-ориентированная парадигма (ОПП) является фундаментом разработки современных программных комплексов. Изучающая такие средства дисциплина имеет как теоретическую составляющую (объектно-ориентированный подход к анализу предметной области), так и практическую (синтез информационной системы с использованием инструментов объектно-ориентированной разработки). Реализация программных систем на основе ООП может быть выполнена различными языковыми средствами. В учебнике представлены теоретические знания и практические навыки, необходимые для разработки на основе модели объектно-ориентированного программирования приложений в среде Visual Studio на языке программирования С#. Учебник предназначен для студентов специальностей 230100 «Информатика и вычислительная техника», 231300 «Прикладная математика», 230700 «Прикладная информатика», 220700 «Автоматизация технологических процессов и производств».
Тематика:
ББК:
УДК:
- 004: Информационные технологии. Вычислительная техника...
- 681: Точная механика. Автоматика. Приборостроение
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ «МИСиС» № 2232 Кафедра автоматизированных систем управления С.Э. Мурадханов А.И. Широков Информатика и программирование Объектно-ориентированное программирование (на основе языка С#) Учебник Рекомендовано редакционно-издательским советом университета Москва 2015
УДК 681.3 М91 Р е ц е н з е н т канд. техн. наук, доц. И.Н. Лесовская (Национальный исследовательский университет «Высшая школа экономики») Мурадханов С.Э. М91 Информатика и программирование : объектно-ориентированное программирование (на основе языка С#) : учеб. / С.Э. Мурадханов, А.И. Широков. – М. : Изд. Дом МИСиС, 2015. – 309 с. ISBN 978-5-87623-801-6 Объектно-ориентированная парадигма (ОПП) является фундаментом разработки современных программных комплексов. Изучающая такие средства дисциплина имеет как теоретическую составляющую (объектно-ориентированный подход к анализу предметной области), так и практическую (синтез информационной системы с использованием инструментов объектно-ориентированной разработки). Реализация программных систем на основе ООП может быть выполнена различными языковыми средствами. В учебнике представлены теоретические знания и практические навыки, необходимые для разработки на основе модели объектно-ориентированного программирования приложений в среде Visual Studio на языке программирования С#. Учебник предназначен для студентов специальностей 230100 «Информатика и вычислительная техника», 231300 «Прикладная математика», 230700 «Прикладная информатика», 220700 «Автоматизация технологических процессов и производств». УДК 681.3 ISBN 978-5-87623-801-6 © С.Э. Мурадханов, А.И. Широков, 2015
ОГЛАВЛЕНИЕ Предисловие..........................................................................................6 1. Классы, объекты, элементы, создание приложений......................7 1.1. C# и ООП: классы, объекты, элементы, создание приложений............................................................................................. 7 1.1.1. Классы, объекты, элементы.............................................8 1.1.2. Инкапсуляция, вложенность, наследование, полиморфизм ..............................................................................11 1.1.3. Cоздание приложений С#................................................15 1.2. Описание класса.............................................................................. 28 1.3. Поля класса....................................................................................... 31 1.4. Методы класса ................................................................................. 33 1.5. Методы-свойства............................................................................. 41 1.6. Статические поля и методы класса............................................... 47 1.7. Перегрузка операций класса.......................................................... 48 1.8. Определение преобразования типов ............................................ 56 1.9. Индексаторы .................................................................................... 62 Контрольные вопросы ........................................................................... 66 2. Делегаты С# ......................................................................................68 2.1. Функциональный тип (делегат) и его экземпляры..................... 68 2.2. Делегаты-свойства .......................................................................... 76 2.3. Класс Delegate. Операции над делегатами.................................. 81 2.4. Использование делегатов............................................................... 84 2.4.1. Делегат для выбора методов на этапе выполнения.......84 2.4.2. Делегат как оповещатель. Паттерн «наблюдатель»......87 2.4.3. Делегат функции обратного вызова. Метод «раскрутки»......................................................................89 2.4.4. Наследование и полиморфизм – альтернатива братному вызову.........................................................................94 2.4.5. Делегаты и анонимные методы.......................................97 2.5. События класса................................................................................ 103 2.5.1. Тип «событие» (объявление)...........................................104 2.5.2. Обработка событий в классах .........................................108 2.5.3. События и стандартные делегаты...................................111 2.5.4. Классы с большим числом событий...............................113 Контрольные вопросы ........................................................................... 117 3. Интерфейсы.......................................................................................118 3.1. Описание интерфейсов................................................................... 118
3.2. Два способа реализации интерфейсов: явная и неявная реализация..............................................................................121 3.3. Приведение к типу интерфейса .....................................................124 3.4. Множественное наследование интерфейсов ...............................128 3.4.1. Коллизия имен интерфейсов...........................................128 3.4.2. Наследование интерфейса от общего предка ................132 3.5. Множественные стандартные (встроенные) интерфейсы .Net Framework ..................................................................134 3.5.1. Сортировка (упорядоченность) объектов: интерфейс IComparable..............................................................137 3.5.2. Перечислимость объектов, интерфейсы, итераторы.....139 3.5.3. Клонирование и интерфейс Icloneable ...........................149 3.5.4. Сериализация объектов: атрибут [Serializable] и интерфейс Iserializable ............................................................154 Контрольные вопросы............................................................................162 4. Отношения между классами............................................................163 4.1. Отношение вложенности................................................................164 4.1.1. Виды отношения «клиент – поставщик» .......................165 4.1.2. Отношения между клиентами и поставщиками............166 4.2. Отношение наследования...............................................................167 4.2.1. Описание производного класса при наследовании.......168 4.2.2. Конструкторы базового и производного классов..........171 4.2.3. Переменные базового и производных классов, связывание ..................................................................................178 4.2.4. Добавление полей в производный класс........................181 4.2.5. Добавление и изменение методов родителя в производном классе.................................................................182 4.2.6. Запрет наследования классов..........................................191 4.3. Абстрактные классы........................................................................192 4.4. Использование UML – виды отношений между классами........195 4.5. Многоуровневая иерархия..............................................................201 Контрольные вопросы............................................................................208 5. Универсальные классы, коллекции, регулярные выражения.......209 5.1. Универсальные классы....................................................................209 5.1.1. Описание универсального класса...................................209 5.1.2. Ограничения универсального класса .............................212 5.1.3. Класс с универсальными методами класса....................213 5.1.4. Наследование и универсальность – методология ООП .............................................................................................217 5.1.5. Универсальность (другие виды классов) .......................236
5.2. Коллекции......................................................................................... 240 5.2.1. Коллекция ArrayList.........................................................240 5.2.2. Коллекции Queue и Stack.................................................246 5.3. Словари......................................................................................247 5.3.1. Коллекция Hashtable ........................................................248 5.3.2. Коллекция SortedList........................................................252 5.4. Обобщенные классы коллекций ................................................... 257 5.4.1. Обобщенная коллекция List<T> .....................................258 5.4.2. Обобщенная коллекция Dictionary<T,U>.......................260 5.4.3. Обобщенная коллекция SortedList<T,U> .......................262 5.4.4. Обобщенная коллекция Queue<T> .................................265 5.4.5. Обобщенная коллекция Stack<T>...................................266 5.5. Регулярные выражения .................................................................. 267 Контрольные вопросы ........................................................................... 284 Библиографический список.................................................................285 Приложение...........................................................................................287
ПРЕДИСЛОВИЕ Учебник продолжает тему использования языка С# при разработке различных программных систем ∗. В нем описываются методология и способы использования языка программирования C# при разработке объектно-ориентированных программных систем. Приобретаемые при изучении изложенного здесь материала знания и навыки являются достаточными для применения объектно-ориентированного подхода на основе языка программирования C# и платформы Microsoft .Net Framework при решении практических задач (см. приложение). Представленный материал предназначен для получения студентами знаний и навыков в области информационных технологий. Также он может быть полезен для всех желающих освоить язык программирования C# самостоятельно. Учебник содержит достаточно полную и систематизированную информацию по языковым конструкциям C#, методологии и способам их применения при реализации объектно-ориентированного подхода к разработке сложных программных систем. Язык программирования C# нельзя изучать «линейно» – «от аксиом к теоремам, описаниям и задачам», поэтому изложение материала (объектно-ориентированное программирование на языке С#) будет проходить «по спирали». Некоторые понятия, использованные в той или иной программе-примере, имеют краткое описание, но в последующих разделах они будут полностью рассмотрены и объяснены. ––––––––– ∗ См. учебник: Мурадханов С.Э., Широков А.И. Информатика и программирование: Основы разработки программ на языке С#: Учеб. – М.: Изд. Дом МИСиС, 2013. – 304 с.
1. КЛАССЫ, ОБЪЕКТЫ, ЭЛЕМЕНТЫ, СОЗДАНИЕ ПРИЛОЖЕНИЙ Объектно-ориентированное программирование и проектирование построено на классах. Программную систему, выстроенную в объектном стиле, можно рассматривать как совокупность классов, возможно, объединенных в проекты, пространства имен, решения (как это делается при программировании в Visual Studio .Net Framework). Класс – это обобщенное понятие, определяющее характеристики и поведение некоторого множества объектов, называемых экземплярами класса. «Классический» класс содержит данные, определяющие свойства объектов класса, и методы, определяющие их поведение. Все классы библиотеки .Net Framework, а также все классы, которые создает программист в среде .Net Framework, имеют одного общего предка – класс object. У этого класса две различные роли: модуля и типа данных. Состав класса и его размер определяются не архитектурными соображениями, а той абстракцией данных (видом представления), которую должен реализовать класс. Объектноориентированная разработка программной системы основана на стиле, называемом проектированием от данных. Проектирование системы сводится к поиску абстракций данных, подходящих для конкретной задачи. Каждая из таких абстракций реализуется в виде класса, которые и становятся модулями – архитектурными единицами построения системы. В основе класса лежит абстрактный тип данных. 1.1. C# и ООП: классы, объекты, элементы, создание приложений В ООП основными элементами программы являются объекты. Объекты – это программные конструкции, включающие набор логически связанных свойств (данных) и методов. Объекты – автономные «сущности», предоставляющие свою функциональность (функциональные возможности) другим компонентам среды приложения, изолируя от них свое внутреннее устройство. Объекты создаются на основе шаблонов, которые называются классами и являются экземплярами этих классов. Библиотека .Net платформы FCL предоставляет большой набор уже созданных классов, которые можно применять для использования объектов в приложениях. В приложениях можно
создавать классы, требующиеся для описания решаемой задачи. Описание класса «Автомобиль»: class Автомобиль { // описание данных // описание методов } 1.1.1. Классы, объекты, элементы Классы В ООП классы – это «шаблоны» (чертежи) объектов. Они определяют все элементы объекта: свойства и поведение (методы), а также задают начальные значения для создаваемых объектов, если это необходимо. Класс – механизм, задающий структуру (поля данных) всех однотипных объектов и их функциональность (механизм, определяющий все методы, относящиеся к объектам). Среди данных и методов класса (объекта) могут существовать такие, которые принадлежат не единичному объекту, а всем объектам класса (данные могут меняться у любых объектов класса, метод класса может оперировать с любыми объектами класса). Класс может представлять собой: • контейнер для методов класса и данных класса, принадлежащих всем объектам класса; • «трафарет» («шаблон»), позволяющий создавать конкретные объекты (экземпляры) класса. Класс «Студент группы № курса» может содержать: • поля (данные) объекта: ФИО, оценки, книги из библиотеки; • методы (данные) объекта: сдать экзамен, получить/сдать книги из библиотеки; • поля (данные) класса: номер курса, даты экзаменов, количество предметов; • методы (данные) класса: перевести группу на следующий курс – изменятся все данные класса (не все объекты останутся в измененном классе – не обязательно все студенты будут переведены на следующий курс). Различие между данными и методами объектов и данными и методами их класса часто используется в C#. В определении (объявле
нии) класса его данные и методы, принадлежащие всем объектам класса, описываются модификатором static (статический). Поля и методы, как класса, так и формируемых с его помощью объектов, называются членами класса. При создании экземпляра класса в памяти создается копия этого класса. Созданный таким образом экземпляр класса называют объектом. Для создания экземпляра класса используется специальная операция new: // Объявление переменной типа Автомобиль Автомобиль Auto; // переменная – это не объект класса! // Создание экземпляра класса Автомобиль // и сохранение ссылки на него в переменной myAuto Auto = new Автомобиль(); При создании экземпляра класса выделяется блок оперативной памяти, в который записывается копия данных, и адрес этого блока присваивается переменной (переменная Auto хранит ссылку). Экземпляры класса не зависят друг от друга и являются отдельными программными конструкциями. Можно создавать произвольное число копий класса, которые могут существовать одновременно. Продолжая параллель с реальным миром, можно сказать: если считать конкретный автомобиль объектом, то чертежи автомобиля представляют собой класс Автомобиль. По чертежу можно сделать сколько угодно автомобилей. Если один из автомобилей будет работать не так, как все, это никак не повлияет на остальные автомобили. У класса две различные роли: модуля и типа данных. Класс – это модуль, архитектурная единица построения программной системы. Модульность построения – основное свойство программных систем. В ООП программная система, построенная по модульному принципу, состоит из классов, являющихся основным видом модуля. Модуль может не представлять собой содержательную единицу – его размер и содержание определяются архитектурными соображениями (можно построить монолитную систему, состоящую из одного модуля, – она может решать ту же задачу, что и система, состоящая из многих модулей). Вторая роль класса не менее важна. Класс – это тип данных для реализации некоторой абстракции данных, характерной для задачи, в результате решения которой создается программная система. С этих позиций классы – не просто «кирпичики», из которых строится система. Каждый кирпичик имеет важную содержательную начинку. Сравним современный дом, построенный из обычных кирпичей, и
дом будущего, где каждый кирпич выполняет определенную функцию: один следит за температурой, другой – за составом воздуха в доме. ООП-система представляет собой дом будущего. Состав класса определяется не архитектурными соображениями, а той абстракцией данных, которую должен реализовать класс (в класс Account, реализующий абстракцию «Банковский счет», нельзя добавить поля из класса Car, реализующего абстракцию «Автомобиль»). Разработка ООП-системы основана на стиле, называемом проектированием от данных. Проектирование системы сводится к поиску абстракций данных, подходящих для конкретной задачи. Каждая из таких абстракций реализуется в виде класса; эти классы и становятся модулями – архитектурными единицами построения системы. В основе класса лежит абстрактный тип данных. В хорошо спроектированной объектно-ориентированной системе каждый класс играет обе роли – каждый модуль системы имеет определенную смысловую нагрузку (типичная ошибка – рассматривать класс только как архитектурную единицу, объединяя под оболочкой класса разнородные поля и функции, в результате чего становится непонятно, какой же тип данных задает этот класс). Объекты и элементы. Объекты состоят из элементов, к которым относят поля, свойства, методы и события, представляющие данные и функциональность объекта. Поля содержат данные объекта; свойства – предоставляют управляемый способ доступа к данным объекта; методы определяют действия, которые объект способен выполнять; события уведомляют заинтересованных пользователей (другие классы, которые могут принимать («подписываться на») эти события), если в объекте происходит что-то важное. Свойства объектов класса Автомобиль, например такие как Цвет, Модель, Расход_топлива, являются данными, описывающими состояние объекта, а методы этих объектов Нажать_акселератор, Переключить_передачу, Повернуть_руль описывают функциональность автомобиля. Методы позволяют реализовать поведение объекта. События представляют собой уведомления о важных происшествиях в объекте (количество бензина стало ниже заданной величины или объект класса Двигатель может уведомить объект класса Автомобиль о событии Перегрев_двигателя). В этом случае описание класса Автомобиль выглядит следующим образом: class Автомобиль { // описание свойств