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

Объектно-ориентированное программирование с примерами на C#

Покупка
Основная коллекция
Артикул: 717829.03.01
К покупке доступен более свежий выпуск Перейти
В учебном пособии представлены основы объектно-ориентированного программирования и его особенности применительно к языку С#. Подробно рассмотрены классы потокового ввода-вывода, контейнерные классы для создания динамических структур данных (коллекций), классы обработки исключений. Изложены принципы создания и функционирования приложений для операционной системы Microsoft Windows в среде системы программирования Microsoft Visual Studio с использованием технологий Windows Forms и Windows Presentation Foundation (WPF). Представлены методы и средства создания пользовательского интерфейса: меню, окон диалога с элементами управления, панелей управления и строк состояния. Рассмотрены принципы работы с документами в приложениях Windows на основе объектно-ориентированного подхода: просмотр и редактирование документов с использованием элементов управления, применение стандартных диалогов Windows, сохранение документов во внешней памяти и их восстановление (загрузка) из нее, печать документов, организация связи между типом документов и приложением. Для студентов учреждений среднего профессионального образования, обучающихся по укрупненным группам специальностей 09.02.00 «Информатика и вычислительная техника», 10.02.00 «Информационная безопасность», будет полезно всем интересующимся методами и средствами программирования.
Хорев, П. Б. Объектно-ориентированное программирование с примерами на С# : учебное пособие / П.Б. Хорев. — Москва : ФОРУМ : ИНФРА-М, 2021. — 200 с. — (Среднее профессиональное образование). - ISBN 978-5-00091-713-8. - Текст : электронный. - URL: https://znanium.com/catalog/product/1195623 (дата обращения: 29.03.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
П.Б. Хорев

Москва                                        2021

ИНФРА-М

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ 
ПРОГРАММИРОВАНИЕ 
С ПРИМЕРАМИ НА С#

УЧЕБНОЕ ПОСОБИЕ

Рекомендовано Межрегиональным учебно-методическим советом 
профессионального образования в качестве учебного пособия для учебных заведений, 
реализующих программу среднего профессионального образования по укрупненным группам 
специальностей 09.02.00 «Информатика и вычислительная техника», 
10.02.00 «Информационная безопасность» 
(протокол № 10 от 27.05.2019)

Хорев П.Б. 
Х79 
 
Объектно-ориентированное программирование с примерами на С# : учебное пособие / П.Б. Хорев. — Москва : ФОРУМ : ИНФРА-М, 2021. — 200 с. — 
(Среднее профессиональное образование).

ISBN 978-5-00091-713-8 (ФОРУМ)
ISBN 978-5-16-015548-7 (ИНФРА-М, print)
ISBN 978-5-16-109041-1 (ИНФРА-М, online)

В учебном пособии представлены основы объектно-ориентированного программирования и его особенности применительно к языку С#. Подробно рассмотрены 
классы потокового ввода-вывода, контейнерные классы для создания динамических структур данных (коллекций), классы обработки исключений. Изложены 
принципы создания и функционирования приложений для операционной системы 
Microsoft Windows в среде системы программирования Microsoft Visual Studio с использованием технологий Windows Forms и Windows Presentation Foundation (WPF). 
Представлены методы и средства создания пользовательского интерфейса: меню, 
окон диалога с элементами управления, панелей управления и строк состояния.
Рассмотрены принципы работы с документами в приложениях Windows на основе объектно-ориентированного подхода: просмотр и редактирование документов с использованием элементов управления, применение стандартных диалогов 
Windows, сохранение документов во внешней памяти и их восстановление (загрузка) 
из нее, печать документов, организация связи между типом документов и приложением.
Для студентов учреждений среднего профессионального образования, обучающихся по укрупненным группам специальностей 09.02.00 «Информатика и вычислительная техника», 10.02.00 «Информационная безопасность», будет полезно 
всем интересующимся методами и средствами программирования.

УДК 004.43(075.32)
ББК 32.973.26-018.1я723

ISBN 978-5-00091-713-8 (ФОРУМ)
ISBN 978-5-16-015548-7 (ИНФРА-М, print)
ISBN 978-5-16-109041-1 (ИНФРА-М, online)

УДК 004.43(075.32)
ББК 32.973.26-018.1я723
 
Х79

© Хорев П.Б., 2020

Р е ц е н з е н т ы:
Маран М.М. — кандидат технических наук, доцент кафедры прикладной математики Национального исследовательского университета «МЭИ»;
Меньшикова К.Г. — кандидат технических наук, доцент кафедры прикладной 
математики Национального исследовательского университета «МЭИ»

Предисловие

Более 10 лет назад вышло в свет учебное пособие автора «Технологии объектноориентированного программирования». За прошедшее время пособие переиздавалось три раза (третье и четвертое издания выходили под названием
«Объектноориентированное программирование»), и это может свидетельствовать о том, что читатели обратили внимание на данную книгу и она оказалась им
полезной.
В упомянутом учебном пособии приемы объектноориентированного программирования иллюстрировались примерами программ на языках C++ и Object
Pascal, разработанных в системах программирования Microsoft Visual Studio,
Borland C++ Builder и Borland Delphi.
Но время идет, происходит естественное обновление языков и систем программирования, поэтому было решено создать новое учебное пособие по объектноориентированному программированию с примерами программ на языке C#,
разработанных в системе программирования Microsoft Visual Studio с использованием технологий Windows Forms и Windows Presentation Foundation (WPF).
Автор надеется, что и это учебное пособие окажется полезным всем обучающимся программированию и желающим совершенствовать свои навыки разработки программ.

Введение

В основе современных технологий программирования лежит объектноориентированный подход (ООП), позволяющий, в частности, повысить надежность
разрабатываемых программных средств и уменьшить объем нового программирования за счет использования классов, созданных ранее. Широко используемый в настоящее время универсальный язык программирования C# включает
развитые средства ООП, изучение которых является обязательной частью второго этапа подготовки бакалавров в области программирования.
Объектноориентированный подход к программированию основывается на
выделении в решаемой задаче базовых понятий, которые характеризуются определенным набором свойств и над которыми могут выполняться определенные
действия. Принципы объектноориентированного подхода таковы:
• получение и изменения свойства возможны только с помощью заранее определенного действия (инкапсуляция);
• возможно определение иерархической структуры понятий, причем понятия низших уровней иерархии «наследуют» свойства и действия, определенные для их базовых понятий (наследование);
• в любом производном понятии возможно изменение содержания действия,
определенного для базового понятия (полиморфизм).
К преимуществам объектноориентированного подхода относятся:
• повышение надежности программирования за счет разделения частных деталей реализации того или иного понятия (например, структуры данных,
хранящих значения свойств) и характеристик понятия, необходимых для
его правильного использования в программе (списка определенных действий);
• повышение производительности программирования за счет использования
при решении новой задачи уже созданной иерархии понятий и добавления
к ней новых уровней.
К недостаткам объектноориентированного подхода следует отнести снижение эффективности разрабатываемых программ по сравнению с процедурным
подходом.
Разработка приложений для операционной системы Windows основывается
на ООП. Кроме этого, приложения Windows относятся к классу программ,
управляемых событиями. Большое распространение в настоящее время получила
универсальная система программирования для Windows Microsoft Visual Studio.

В этой системе при разработке программ используется библиотека классов
Foundation Class Library (FCL), организованная в виде пространств имен.
В системе Microsoft Visual Studio для C# при разработке программ используются две различные технологии — Windows Forms и Windows Presentation
Foundation (WPF). Поэтому при изучении объектноориентированного программирования целесообразно освоение обеих этих технологий.
Технология Windows Forms использует развитые средства визуального проектирования программ и существенно упрощает разработку пользовательского
интерфейса по сравнению с библиотекой классов Framework Class Library
(MFC), которая использовалась в Microsoft Visual Studio для C++. Классы библиотеки FCL представляют собой «обертки» над функциями из набора Windows
API и позволяют выполнять вызовы этих функций в коде, управляемом средой
Microsoft .Net.
Технология WPF представляет собой совершенно другой интерфейс прикладного программирования для управления слоем презентации разрабатываемого приложения. Эта технология была разработана для преодоления недостатков и ограничений, присущих технологии Windows Forms. Хотя во многом технология WPF является преемником технологии Windows Forms, овладение ею
требует от разработчика больших усилий, поскольку она заметно отличается от
своего предшественника.
В приложениях WPF окна и элементы управления не создаются стандартным
способом и в стандартном виде, присущем операционной системе Windows. При
проектировании приложения Windows Forms разработчик создает пользовательский интерфейс с помощью визуального конструктора, автоматически генерируя
при этом код в файле с расширением .designer. Фактически при этом пользовательский интерфейс определяется и управляется кодом на языке C#. В приложении WPF пользовательский интерфейс определяется кодом на языке разметки
Extensible Application Markup Language (XAML), который создан на основе расширенного языка разметки XML. Именно язык XAML, лежащий в основе технологии WPF, обеспечивает ее мощь и гибкость, позволяя разрабатывать намного
более индивидуальные пользовательские интерфейсы по сравнению с технологией Windows Forms.
При разработке приложения WPF нужно сконцентрироваться на преимуществах, которые дают новые возможности связывания объектов программы, предоставляемые языком XAML, и рассматривать свой код не как контроллер пользовательского интерфейса, а как обслуживающий механизм. Благодаря гибкости
языка XAML технология WPF позволяет разрабатывать уникальные пользовательские интерфейсы и способы интерактивного взаимодействия пользователя с
программой, в основе которых лежит отделение внешнего вида элементов управления от их поведения. Это позволяет легко изменять внешний вид элементов
управления без изменения самого элемента.
Естественно, профессиональный разработчик программных средств должен
знать несколько языков программирования и владеть навыками создания проВведение
5

граммного обеспечения с применением различных систем и технологий программирования.
Учебное пособие включает три главы. Принципы объектноориентированного программирования изложены в главе 1. Подробно рассматриваются классы
C# для организации вводавывода, создания динамических структур данных и
обработки исключений. Здесь же приведены базовые сведения о разработке приложений Windows с использованием системы программирования Microsoft Visual
Studio. Излагаются принципы разработки программ, управляемых событиями
(сообщениями), обработки стандартных событий и событий, создаваемых в программе.
В этой и последующих главах учебного пособия вначале излагаются общие
принципы решения той или иной задачи на базе объектноориентированного
подхода, а затем приводятся сведения об использовании этих принципов в приложениях Windows Forms и WPF и примеры программ.
Глава 2 учебного пособия посвящена созданию пользовательского интерфейса в приложениях Windows — меню, диалоговых окон, панелей управления и
строк состояния. Рассматриваются и те вопросы, которые обычно опускаются в
руководствах по программированию (в частности, динамическое изменение
меню и создание перемещаемых панелей управления, содержащих помимо кнопок произвольные интерфейсные элементы). Особое внимание уделяется вопросам проверки правильности введенных пользователем данных.
В третьей главе подробно раскрыты методы организации работы с документами в приложениях Windows — их просмотра и редактирования, сохранения и
восстановления (загрузки), печати и регистрации в системном реестре.
Учебное пособие содержит очень много хорошо прокомментированных примеров программ, которые должны помочь читателю освоить практические приемы объектноориентированного программирования и лучше понять излагаемый
теоретический материал. Все примеры в учебном пособии были проверены в
системе программирования Microsoft Visual Studio 2012.
Предполагается, что начиная знакомство с учебным пособием, читатель имеет базовые знания о языке программирования C# и расширенном языке разметки XML.

6
Введение

Глава 1
ОСНОВЫ ОБЪЕКТНООРИЕНТИРОВАННОГО
ПРОГРАММИРОВАНИЯ
И ПРОГРАММИРОВАНИЯ ДЛЯ WINDOWS

1.1. Принципы и основные понятия
объектноориентированного программирования

В основе объектноориентированного программирования (ООП) лежит понятие класса, под которым понимают новый тип данных, вводимый разработчиком при решении конкретной задачи. Элементами класса являются поля и методы. Поля — это данные, которые образуют значение нового типа данных. Методы — это операции над значениями нового типа данных.
Например, при решении задачи продажи билетов на самолет удобно ввести
класс «Авиарейс». Полями этого класса могут быть номер рейса, дата выполнения, аэропорты вылета и назначения, время вылета, время прибытия, тип самолета, общее количество мест, количество проданных и забронированных мест,
цена одного билета. Методами создаваемого класса станут действия по продаже
или бронированию заданного количества билетов, получению времени полета,
получению количества свободных мест и т. п.
Технология ООП базируется на трех принципах: инкапсуляции, наследования и полиморфизма. Принцип инкапсуляции подразумевает такое объединение
внутри класса его полей и методов, при котором доступ к полю возможен только
путем вызова соответствующего метода. Реализация данного принципа позволяет существенно повысить надежность программирования, так как вместо практически неконтролируемого использования в программе имен переменных программист должен будет использовать для доступа к данным ограниченное число
методов. Эти методы могут быть тщательно протестированы и, тем самым, с высокой вероятностью свободны от ошибок.
Элементы класса подразделяются на личные, доступ к которым разрешен
только внутри методов этого класса, и общие, доступ к которым разрешен в любом месте программы. Очевидно, что выполнение принципа инкапсуляции не
позволяет создавать в классе общие поля.
Для использования в программе определенного класса необходимо создать
его экземпляры (или объекты), являющиеся аналогами переменных обычных типов данных. Экземпляры класса в программе могут создаваться автоматически
(при входе в соответствующий блок, в котором данные экземпляры были определены) или динамически (в произвольном месте программы при помощи специальной операции). Уничтожение автоматически созданных экземпляров класса
происходит также автоматически при завершении выполнения блока программы, в котором они были определены. Уничтожение динамически созданных экземпляров класса может выполняться автоматически при выходе из блока или в
любом месте программы с помощью явно указываемой специальной операции.
Среди методов класса существуют две специальные группы: конструкторы и
деструкторы. Конструкторы выполняют функцию инициализации полей класса
и должны вызываться при создании его экземпляров. Деструктор выполняется
при уничтожении экземпляра класса.
Вызов метода класса отличается от вызова обычной функции (подпрограммы). Метод вызывается с указанием конкретного экземпляра класса, для которого он выполняется. Точно также мы не можем в программе записать только знак
операции +, а должны указать данные, над которыми выполняется сложение,
например a + 1.
Интересным является вопрос полноты и избыточности набора методов создаваемого класса. Если набор методов окажется неполным, то программисту
потребуется создавать дополнительный программный код для реализации отсутствующих в используемом классе возможностей. Избыточность набора методов
ухудшит показатели эффективности создаваемой программы. Хотя универсальных рекомендаций по этому поводу дать невозможно, обычно считается необходимым и достаточным, чтобы в наборе методов создаваемого класса присутствовали:
• конструкторы без параметров;
• конструкторы, имеющие параметры, или модификаторы (методы, изменяющие значения экземпляров класса);
• наблюдатели (методы, возвращающие значения, типы которых отличны от
создаваемого класса).
От обычных элементов класса отличаются статические поля и методы. Статическое поле является общим для всех экземпляров класса (т. е. существует в
единственной копии независимо от того, сколько экземпляров создано и создан
ли хотя бы один экземпляр). Примером статического поля может быть поле, хранящее число существующих экземпляров класса. Фактически статические поля
класса являются глобальными переменными, «заключенными» внутри класса.
Статический метод может вызываться, даже если ни одного экземпляра
класса не создано. В этом случае при вызове статического метода необходимо
указать имя класса, а не имя экземпляра класса. В статическом методе нельзя обращаться к нестатическим полям класса.

8
Глава 1. Основы объектноориентированного программирования...

Вторым принципом ООП является наследование: возможность определения
для базового класса (предка) иерархии производных классов (наследников), в каждом из которых доступны элементы базового класса (их описания становятся
частью описания производного класса). Помимо личных и общих элементов в
классе можно определить защищенные поля и методы, доступ к которым разрешен только в методах самого класса и всех его наследников. Разрешено присваивание экземпляру класса (указателю на него) значения экземпляра того же класса (указателя на него) или производного от этого класса.
Реализация принципа наследования позволяет существенно сократить объем
нового программирования. Поскольку совершенно оригинальных программ
приходится создавать не так уж и много, программист может «позаимствовать»
из предыдущего проекта те классы, которые пригодятся ему в новом.
Наследование может быть личным или общим. При личном наследовании
общие и защищенные элементы классапредка становятся личными в классенаследнике и не могут использоваться при дальнейшем наследовании элементов
уже нового класса. При общем наследовании общие и защищенные элементы
базового класса остаются такими же и в производном классе.
Наследование может быть также единичным (когда предок один) и множественным (когда базовых классов более одного). При реализации множественного
наследования может возникнуть следующая проблема. Допустим, что у класса A,
имеющего защищенное поле pa, определен наследник — класс B. Пусть в программе будет определен еще и класс C, который станет наследником классов A и
B. Проблема заключается в том, что поле pa в классе C будет наследоваться как
напрямую из класса A, так и из класса B, что вызовет неоднозначность при компиляции программы. Выходом из этой ситуации является введение так называемого виртуального наследования, при котором в объекты производных классов
включаются не сами наследуемые поля, а указатели на занимаемую ими область
памяти.
Третий принцип ООП — полиморфизм — предполагает возможность определения единого по имени метода для всей иерархии производных классов, причем
в каждом из них этот метод может реализовываться со своими особенностями.
Реализация принципа полиморфизма гарантирует, что для любого экземпляра
класса будут вызываться методы именно этого класса, а не одного из его предков.
Этот принцип ООП позволяет программисту свободно изменять те методы классапредка, которые должны иначе выполняться в классенаследнике.
Полиморфизм реализуется путем введения виртуальных методов, которые
отличаются от обычных тем, что адрес вызываемого метода определяется не при
компиляции программы, а при ее выполнении (происходит так называемое
«позднее связывание»). В любой экземпляр класса с виртуальными методами добавляется скрытое поле — указатель на таблицу виртуальных методов, в которой
для каждого такого метода указывается адрес его реализации в данном классе.
Покажем на небольшом примере необходимость введения виртуальных методов. Допустим, мы создали в программе класс X, имеющий методы f1и f2, причем в методе f1 вызывается метод f2. Далее мы определили класс Y — наследник

1.1. Принципы и основные понятия ООП
9

класса X — и изменили в Y метод f2. Пусть oy — экземпляр класса Y, для которого
вызывается метод f1. Компилятор не находит в классе Y метод f1 и обращается к
классу X, где метод с таким именем существует. Когда компилятор доходит в методе f1 до вызова метода f2, то вызовет метод класса X, хотя объект oy относится к
классу Y. При использовании в нашем примере «обычных» (не виртуальных) методов компилятор не сможет «узнать» о факте изменения в наследнике одного из
методов классапредка.
Конструкторы, за редким исключением, не должны объявляться виртуальными, так как они вызываются при создании экземпляра известного компилятору класса. А вот при уничтожении динамически созданного объекта и вызове деструктора конкретный класс адресуемого с помощью указателя объекта (базовый
или производный) компилятору может быть и неизвестен. Поэтому для корректного уничтожения экземпляров классов разумно использовать виртуальные деструкторы.
В базовом классе можно описать только прототипы виртуальных методов без
их полного определения, предполагая, что это обязательно будет сделано в классенаследнике. Подобные методы называются абстрактными, а класс, имеющий
хотя бы один абстрактный метод, — абстрактным классом. Создать экземпляры
абстрактного класса нельзя.
Абстрактными обычно бывают старшие (расположенные на верхних уровнях
иерархии) классы библиотеки классов. Например, абстрактный класс «Фигура»
может содержать абстрактные методы «Показать» и «Переместить», которые будут реализованы в его наследниках — классах «Окружность», «Прямоугольник» и
«Надпись». Очевидно, что абстрактные методы должны быть виртуальными.
В обычных методах абстрактного класса разрешен вызов абстрактных методов.
Исключением здесь являются деструкторы абстрактных классов. В них вызов абстрактных методов запрещен, так как на момент этого вызова часть объекта, относящаяся к производному классу, уже может быть удалена деструктором классанаследника.

1.2. Специфика ООП на языке программирования C#

В языке C# определение класса выглядит следующим образом:

class имя класса
{
описания полей класса
описания методов класса
}

Поле класса описывается аналогично переменной или полю структуры, но с
добавлением режима доступа к полю:

режим доступа имя типа имя поля; // комментарий

10
Глава 1. Основы объектноориентированного программирования...

Возможные типы доступа: public (общее поле); private (личное поле, этот режим доступа используется по умолчанию); protected (защищенное поле); internal
(общее поле, доступ к которому возможен только из данной сборки); protected
internal (общее поле, доступ к которому возможен из данной сборки, а также из
другой сборки в экземпляре класса, производного от класса, в котором объявлено поле).
Напомним, что для платформы Microsoft .Net сборка является базовой единицей развертывания приложения, управления его версиями и повторным использованием. Сборки принимают форму исполняемого файла (exe) или файла
динамически компонуемой библиотеки (DLL) и являются стандартными блоками платформы .Net Framework. Среда выполнения Common Language Runtime
(CLR) получает от сборок сведения, необходимые для реализации типов данных.
Сборку можно рассматривать как коллекцию типов и ресурсов, формирующих
логическую единицу функциональности приложения и объединенных для совместной работы.
Именем типа может быть имя одного из типов данных C# (sbyte, byte, char,
short, ushort, int, uint, long, ulong, decimal, float, double, bool, string) или имя массива, структуры или класса.
Методы класса описываются внутри него так:

режим доступа тип результата имя метода (список параметров)
{ тело метода }

Режимы доступа public и internal могут использоваться и при определении
класса. Если режим доступа при определении класса не указан, то по умолчанию
используется internal.
Среди полей класса есть стандартное поле this (указатель на текущий экземпляр), которое может использоваться для передачи в качестве параметра другим
функциям программы и, в частности, функциям из набора Windows API.
Конструкторы в C# имеют следующие особенности:
• конструктор обязательно должен иметь режим доступа public;
• имя конструктора совпадает с именем класса (если у класса несколько конструкторов, то они должны различаться своими параметрами);
• при описании конструктора не указывается тип результата, а в его теле не
используется оператор return;
• конструктор не вызывается в программе явно (его вызов обеспечивается
компилятором в момент создания экземпляра класса).
Деструктор в C# имеет следующие особенности:
• имя деструктора образуется как ∼имя класса;
• деструктор не имеет параметров и типа результата, т. е. в классе существует
только один деструктор;
• деструктор не может вызываться в программе явно — его вызов обеспечивается специальным модулем («сборщиком мусора»), освобождающим
оперативную память от более «ненужных» программе объектов.

1.2. Специфика ООП на языке программирования C#
11

Для любого класса без конструктора компилятор автоматически создает конструктор по умолчанию, который не имеет параметров и всем полям экземпляра
класса присваивает значения по умолчанию (обычно нулевые). Если в классе не
определен деструктор, то компилятор создает его автоматически.
Часто в классе определяется конструктор копирования, единственным параметром которого является другой экземпляр этого класса. Значения всех полей
этого экземпляра копируются в поля создаваемого экземпляра класса, например:

class Person
{
// поля класса
int Age;
string Name;
// конструктор копирования
public Person (Person other)
{
Name = other. Name;
Age = other. Age;
}
описания других элементов класса
}

Все экземпляры класса в C# создаются динамически. Вначале определяется
переменнаяэкземпляр класса:

имя класса имя экземпляра;

Фактически определенное таким образом имя экземпляра класса является
указателем, поэтому далее в нужном месте программы необходимо выполнить
создание экземпляра:

имя экземпляра = new имя класса (параметры конструктора);

Динамические экземпляры класса удаляются «сборщиком мусора», т. е. явно
удалять их в программе не надо.
Метод класса вызывается для конкретного экземпляра класса:

имя экземпляра. имя метода (параметры)

Перед описанием статических элементов внутри класса добавляется атрибут
static. Вызов статического метода класса происходит так:

имя класса. имя метода (параметры);

Если класс содержит статические поля, то в нем должен быть определен статический конструктор, который инициализирует эти поля. Основные отличия
статического конструктора:
• не может указываться режим доступа и не могут использоваться параметры
(в классе может быть только один статический конструктор);

12
Глава 1. Основы объектноориентированного программирования...

К покупке доступен более свежий выпуск Перейти