Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Введение в теорию программирования. Объектно-ориентированный подход. Учебное пособие для СПО
.pdf
Рассмотрим более подробно особенности реализации множественного
наследования в языке программирования C#. Для достижения этой
цели потребуется применить механизм интерфейсов для классов и
структур.
Сформулируем требования, необходимые для реализации данного
варианта механизма интерфейсов.
Прежде всего, следует потребовать, чтобы класс имел возможность
наследования свойств лишь единственного базового класса. Однако при
этом класс должен иметь возможность реализации множественных
интерфейсов.
Кроме того, необходимо выдвинуть условия для структур, которые
сводятся к следующему. Структура может наследовать свойства любого
типа данных и при этом имеет возможность реализации
множественных интерфейсов.
Подчеркнем, что важным свойством элементов, входящих в состав
интерфейса (в частности, методов, свойств и индексаторов ) является
возможность реализации или наследования свойств порождающего их
класса.
Заметим далее, что реализованные методы интерфейса не могут быть
замещенными, т.е. задаваться с помощью описателя override .
Наконец, методы, которые реализуются посредством интерфейса, могут
снабжаться одним из описателей, virtual либо abstract . Таким
образом, осуществляется возможность реализации механизма
интерфейсов на основе абстрактного класса.
Проиллюстрируем особенности использования механизма методов с
приоритетами в языке программирования C# следующим фрагментом
программы:
class MyClass :
MyBaseClass, IList, ISerializable
{
public int Add (object value)
{
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
141

...
}
public bool Contains (object value)
{
...
}
...
public bool IsReadOnly
{
get {
...
}
}
...
public object this [int index]
{
get {
...
}
set {
...
}
}
}
Как мы видим, фрагмент программы на языке C# содержит описание
общедоступного интерфейса IList на основе стандартных классов
ICollection и IEnumerable.
Данный пример во многом схож с предыдущим, однако имеет одно
фундаментальное отличие от него.
Отличие заключается в том, что интерфейс IList в данном примере
реализуется на основе базового класса MyBaseClass, определенного
пользователем. При этом интерфейс IList в данном примере
фактически получает возможность множественного наследования.
Заметим, что ни один из методов интерфейса Ilist не является
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
142

замещенным.
Для более подробного самостоятельного ознакомления с тематикой
лекции рекомендуется следующий список источников: [ 23, 26, 53, 59,
62, 63, 74-76].
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
143

Расширенные возможности языка программирования
C#
Цель: ознакомление с расширенными возможностями языка
программирования C# (интерфейсы и делегаты).
Теоретические сведения
Интерфейсы
В языке программирования C# с целью изоляции описательной части
класса от его реализации используется механизм интерфейсов.
Понятие интерфейса является расширением идеи абстрактных классов и
методов. Синтаксис интерфейсов подобен синтаксису абстрактных
классов. Объявление интерфейсов осуществляется с помощью
ключевого слова interface. При этом методы интерфейса не
поддерживают реализации.
Членами интерфейса могут быть методы, свойства, индексаторы и
события.
Интерфейс может реализовываться произвольным количеством классов.
Один класс, в свою очередь, может реализовывать любое число
интерфейсов.
Каждый класс, включающий интерфейс, должен реализовывать его
методы. В интерфейсе для методов неявным образом присутствует
модификатор доступа типа public. При этом явное указание
модификатора доступа недопустимо.
Описание интерфейса
Синтаксис:
[атрибуты] [модификаторы] interface
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
144

Имя_интерфейса[
:список_родительских_интерфейсов] {
обьявление_свойств_и_методов}
Пример:
interface Species
{
string Species();
void Feed();
}
class Cheetah:Animal,Species{
private string ScientificName;
public string Species()
{
return ScientificName;
}
public void Feed()
{
Weight++;
}
}
В языке C# допустимо объявление ссылочных переменных
интерфейсного типа. Такие переменные могут ссылаться на любой
объект, реализующий их интерфейсы. При вызове метода объекта по
интерфейсной ссылке происходит вызов той конкретизации метода,
которая реализуется данным объектом.
В языке C# допустимо наследование интерфейсов. При этом синтаксис
аналогичен таковому для наследования классов. В случае, если класс
реализует интерфейс, который наследует другой интерфейс, необходимо
предусмотреть реализацию всех членов, определенных в составе
иерархии наследования интерфейсов.
Делегаты
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
145

Под делегатом будем понимать объект, который имеет ссылку на метод.
Делегат позволяет осуществлять выбор вызываемого метода во время
выполнения программы. Фактическим значением делегата является
адрес области оперативной памяти, по которому распложена точка
входа метода.
Важным свойством делегата является то, что он позволяет указать в
коде программы вызов метода, однако фактически вызываемый метод
определяется во время выполнения программы, а не во время ее
компиляции.
Делегат объявляется с помощью ключевого слова delegate, за
которым указывается тип возвращаемого значения, имя делегата и
список параметров вызываемых методов.
Описание делегата
Синтаксис:
delegate тип_возвращаемого_значения
имя_делегата (список_параметров);
Характерной особенностью делегата является возможность его
использования для вызова любого метода, который соответствует
подписи делегата. Это дает возможность определить, какой из методов
должен быть вызван, во время выполнения программы. Вызываемый
метод может быть методом экземпляра, ассоциированным с объектом,
либо статическим методом, ассоциированным с классом. Метод можно
вызывать только в том случае, если его подпись соответствует подписи
делегата.
Многоадресность делегатов
Многоадресность - это способность делегата хранить несколько ссылок
на различные методы, что позволяет при вызове делегата
инициировать эту цепочку методов.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
146

Для формирования цепочки методов следует создать экземпляр
делегата, и, пользуясь операторами " + " или " += ", добавлять методы к
цепочке. Для удаления метода из цепочки используется оператор " - "
или " -= ". Делегаты, хранящие несколько ссылок, должны иметь тип
возвращаемого значения void.
Порядок выполнения работы
1. Реализовать программу на C# в соответствии с вариантом
исполнения.
2. Для проверки всех методов данного класса следует использовать
многоадресный делегат.
Варианты заданий
Реализовать для иерархии из лабораторной работы №8 механизм
интерфейсов, при этом один из классов должен реализовывать как
минимум два интерфейса. Использовать для проверки всех методов
данного класса многоадресный делегат.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
147

Событийно управляемое программирование в .NET
В данной лекции будут рассмотрены вопросы, относящиеся к
идеологии, математическому основанию и обзору возможностей
событийно управляемого проектирования и реализации программных
систем - одного из важнейших аспектов современного объектноориентированного программирования.
Ключевым элементом для понимания природы взаимодействия
объектов программы в среде вычислений является понятие события.
Под событием в математическом смысле далее будем иметь в виду
соотнесение над объектом предметной области, который в рамках
терминологии курса будем называть индивидом. При неформальном
подходе под индивидом понимается такой объект предметной области
(или языка программирования), который возможно выделить в этой
области (или языке) посредством указания так называемой
индивидуализирующей функции. Построение такой функции будем
считать зависимым от эксперта в предметной области. Обычно такая
функция имеет в качестве области своих значения истинности (а
именно, "истина" и "ложь") и является истинной при аппликации к
данному объекту и ложной - в противном случае.
Ранее нами было рассмотрено понятие типа как совокупности объектов.
Заметим, что произвольное семейство (действительных в нашем
частном случае) объектов может быть параметризовано (или, иначе,
концептуализировано) не только типами, но и событиями.
В соответствии со схемой двухуровневой концептуализации,
оценивающее отображение ||.|| переводит индивид h- языка (в
частности, языка программирования) в h. Затем возможный
(потенциальный) индивид h из семейства возможных индивидов H
переводится событием i из семейства соотнесений Asg в
действительный индивид h(i) из семейства действительных
индивидов Ui. Аналогично, следующий шаг преобразований,
управляемый событием j из семейства Asg, переводит h(i) в
состояние h(i)(j) (см. рис. 23.1).
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
148

Рис. 23.1. Схема двухуровневой концептуализации объектов данных.
На первый взгляд, определение понятия события в программировании
существенно отличается от одноименной математической концепции.
Под событием в языке программирования обычно понимается способ
внедрения того или иного фрагмента в программный код с целью
изменения поведения программы.
Как только происходит изменение среды вычислений из числа
представляющих интерес для разработчика или пользователя
программного обеспечения, активизируется событие и выполняется
соответствующий фрагмент кода.
В целом, с точки зрения практического программирования, обработка
события подобна вызову процедуры, причем в роли параметров
выступают те или иные характеристики среды вычислений.
Любой современный интерфейс пользователя (или, в математической
терминологии, среда вычислений) построен на основе обработки
событий ( onClick, onMouseMove, onMouseOver и т.д.). События,
которые осуществляют взаимодействие с каналами локальных сетей,
операционной системой, сторонними приложениями и т.д. могут также
активизироваться по времени.
В соответствии со схемой двухуровневой концептуализации, первый
уровень может означать, например, инициацию пользователем события
"щелчок левой кнопкой мыши", а второй - изменение состояния объекта
меню при выборе соответствующего пункта меню. Как видим, сначала
возможный индивид становится действительным (т.е. происходит
активация события ), а затем осуществляется означивание объекта
программы (изменяется текущая позиция меню). Фрагментом кода
программы в таком случае является метод, изменяющий текущую
позицию меню, который активизируется, исходя из значения первого
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
149

соотнесения (т.е. конкретизации события ). Таким образом, на основе
механизма событий осуществляется управление программой.
После изложения понятийного аппарата концепции событийно
управляемого программирования перейдем к вопросу реализации
данного механизма применительно к языку объектно-ориентированного
программирования C#.
В целях реализации механизма событий в языке программирования C#
предусмотрен так называемый механизм делегатов.
Заметим, что механизм делегатов в языке C# является существенным
усовершенствованием ранних подходов сходной функциональности в
языках программирования C и C++, известных под названием функции
обратного вызова (callback function), основанных на использовании
малоинформативных и потенциально небезопасных указателей в
оперативной памяти.
Преимущество делегатов языка C# состоит в большей управляемости и
безопасности кода (в частности, в C# существует возможность контроля
соответствия типов параметров делегатов и логики вызова).
В качестве интуитивного определения понятия делегата отметим, что
под делегатом понимается метод, который ведет себя как тип.
В качестве иллюстрации приведем описание типа- и переменнойделегата на языке С#:
delegate void Notifier (string sender);
// обычное описание метода с
// ключевым словом delegate
Notifier greetings;
// описание переменной-делегата
Как видно из приведенного фрагмента программы, формально
описание типов- и переменных-делегатов не отличается от
традиционного описания методов и переменных.
Фундаментальное отличие переменной-делегата от ранее
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
150
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
