Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Информатика и программирование: объектно-ориентированное программирование (на основе языка С#)

Покупка
Артикул: 753042.01.99
Доступ онлайн
2 000 ₽
В корзину
Объектно-ориентированная парадигма (ОПП) является фундаментом разработки современных программных комплексов. Изучающая такие средства дисциплина имеет как теоретическую составляющую (объектно-ориентированный подход к анализу предметной области), так и практическую (синтез информационной системы с использованием инструментов объектно-ориентированной разработки). Реализация программных систем на основе ООП может быть выполнена различными языковыми средствами. В учебнике представлены теоретические знания и практические навыки, необходимые для разработки на основе модели объектно-ориентированного программирования приложений в среде Visual Studio на языке программирования С#. Учебник предназначен для студентов специальностей 230100 «Информатика и вычислительная техника», 231300 «Прикладная математика», 230700 «Прикладная информатика», 220700 «Автоматизация технологических процессов и производств».
Мурадханов, С. Э. Информатика и программирование: объектно-ориентированное программирование (на основе языка С#) : учебник / С. Э. Мурадханов, А. И. Широков. - Москва : Изд. Дом МИСиС, 2015. - 309 с. - ISBN 978-5-87623-801-6. - Текст : электронный. - URL: https://znanium.com/catalog/product/1232389 (дата обращения: 29.03.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ 

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ  
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ  
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ «МИСиС» 

 

 
 
 

 

 

 

 
 

 

№ 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 Автомобиль 
        {  // описание свойств  

public string Mодель; 
            public float Расход_топлива; 
            private int Число_цилиндров; 
            // описание методов 
            public void Повернуть_руль(){...} 
            private void Регулировка_датчика(){...} 
            // описание события 
           event Событие Перегрев_двигателя; 
        } 

Для доступа к полям, свойствам, методам, элементам объектов 
используется специальная операция точка (.): 

string Mодель; // Объявление переменной Mодель типа string  
Mодель = Auto.Mодель; // определение модели автомобиля 
Auto.Повернуть_руль(); // поворот руля автомобиля 

К элементам объекта имеется доступ не из всех частей программы 
(из методов данного класса или других классов, из других сборок). 
Возможность использования элементов класса задается (явно или 
неявно) с помощью указания режима доступа. Режимы доступа: 
private – элемент, для которого он задан, можно использовать только 
в методах того класса, где он описан (закрытые элементы); public – 
элемент можно использовать в других классах (открытые элементы). 

1.1.2. Инкапсуляция, вложенность, наследование, 
полиморфизм 

Объект – программная конструкция, представляющая некоторую 
сущность. В нашей повседневной жизни сущностями, или объектами, например, можно считать автомобили, велосипеды, настольные 
компьютеры, банковский счет. Каждый объект обладает определенной функциональностью и свойствами. Объект представляет собой 
завершенную функциональную единицу, содержащую все данные и 
предоставляющую всю функциональность, необходимую для решения задачи, для которой он предназначен. Описание объектов реального мира при помощи программных объектов называют абстрагированием.  
Инкапсуляция – отделение реализации объекта (его внутреннего 
содержания) от способа взаимодействия с ним. Другие объекты приложения взаимодействует с рассматриваемым объектом посредством 
имеющихся у него открытых public-свойств и методов, которые со
ставляют его интерфейс. В общем виде под интерфейсом понимается 
открытый способ взаимодействия между разными системами. Если 
интерфейс класса меняется, то приложение сохраняет способность к 
взаимодействию с его объектами, даже если в новой версии класса 
его реализация значительно изменится. Объекты могут взаимодействовать друг с другом только через свои открытые методы и свойства, 
поэтому объект должен предоставлять доступ только к тем свойствам и методам, которые пользователям необходимы. 
Интерфейс не должен открывать доступ к внутренним данным 
объекта, поэтому поля с внутренними данными объекта обычно объявляют с модификатором private. У объектов класса Автомобиль, 
которые могут взаимодействовать с объектами класса Водитель через открытый интерфейс, открытыми объявлены только методы 
Ехатъ_вперед, Ехать_назад, Повернуть и Остановиться – их достаточно для взаимодействия объектов классов Водитель и Автомобиль. У объекта класса Автомобиль может быть вложенный объект 
класса Двигатель, но он будет закрыт для объектов класса Водитель, 
которому будут открыты лишь методы, требуемые для управления 
автомобилем. Можно заменить вложенный объект класса Двигатель, 
и взаимодействующий с ним объект класса Водитель «не заметит» 
замены, если она не нарушит корректную работу интерфейса. 
Классы разных объектов, как и в реальном мире, связаны между 
собой. Выделяются два основных типа взаимосвязи классов: вложенность и наследование. Вложенность – включение объектов одного класса в объекты другого класса. Наследование – описание одного класса на основе другого класса. Объекты одних классов могут 
включать объекты других классов в качестве своих полей и предоставлять к ним доступ, как и к другим своим элементам. Иерархия 
вложенности объектов друг в друга называется объектной моделью 
(object model). Объект класса Автомобиль, который сам по себе является объектом, состоит из ряда вложенных объектов, таких как объект класса Двигатель, четырех объектов класса Колесо, объект класса 
Трансмиссия. Компоновка вложенных объектов непосредственно 
определяет работу объекта класса Автомобиль. Например, поведение 
объектов Автомобиль, у которых свойство Число_цилиндров вложенного объекта Двигатель равно соответственно 4 и 8, будет различным. В свою очередь у вложенных объектов могут быть собственные 
вложенные объекты. Например, объект Двигатель (который является 
вложенным объектом объекта Автомобиль) может иметь вложенные 

объекты Свеча_зажигания. Для получения сведений о марке свечей 
зажигания автомобиля можно записать следующее выражение: 

Auto.Свеча_зажигания.Марка; 

Один класс может быть описан на основе уже имеющегося описания другого класса. В этом случае между классами задается отношение наследования. Наследование позволяет создавать новые классы 
на основе существующих, при этом новые классы обладают всей 
функциональностью старых и при необходимости могут модифицировать их. Класс, объявленный на основе некоторого (базового) 
класса, называется производным, или классом-потомком. У любого 
класса может быть только один прямой предок – его базовый класс 
(base class). У производного класса окажется тот же набор элементов, что и у базового, но, при необходимости, к производному классу 
разрешается добавлять дополнительные элементы. Можно также изменить реализацию членов, унаследованную от базового класса, переопределив их. На основе описания класса Транспортное_средство 
(базовый класс), можно описать класс Автомобиль (производный 
класс), на основе которого, в свою очередь, можно описать классы 
Грузовик, Пассажирский_автомобиль и Спортивный_автомобиль 
(рис. 1.1). 

Транспорт

Корабль
Автомобиль
Самолет

Грузовик 
Пассажирский 
Спортивный 

 

Рис. 1.1. Схема наследования классов 

Пример описания производного класса Автомобиль: 

        class Автомобиль : Транспорт  
        {// описание свойств  
            public string Mодель; 
            public float Расход_топлива; 
            private int Число_цилиндров; 
           // описание методов 

Доступ онлайн
2 000 ₽
В корзину