Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Введение в теорию программирования. Объектно-ориентированный подход. Учебное пособие для СПО

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
остается неизменным. Это обусловлено тем, что при реализации стратегии вызова по значению формальный параметр является копией фактического.
Рассмотрим более подробно особенности стратегии вычислений с вызовом по имени, или, иначе, по ссылке (call-by-reference, CBR).
Прежде всего, в случае вызова по имени формальный параметр является подстановкой (alias) фактического параметра и не занимает отдельной области в памяти компьютера. При реализации данной стратегии вычислений вызывающей функции передается адрес фактического параметра.
Кроме того, фактический параметр в случае вызова по имени должен быть не выражением, а переменной. При этом формальный параметр является копией фактического.
Проиллюстрируем особенности использования стратегии вызова по имени следующим фрагментом программы на языке C#:
void Inc(ref int x) { x = x + 1; } void f() { int val = 3; Inc(ref val); // val == 4 }
Как видно из приведенного примера, фрагмент программы на языке C# реализует преобразование значений val посредством функции f. Функция Inc является функцией следования.
Отметим, что вследствие применения функции Inc к аргументу val, значение переменной val, как явствует из комментария
// val == 4,
изменяется. Это обусловлено тем обстоятельством, что при реализации стратегии вызова по имени формальный параметр является
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
121
подстановкой фактического.
Рассмотрим более подробно особенности стратегии вычислений с вызовом по необходимости (call-by-need, CBN).
В целом, данная стратегия вычислений сходна с вызовом по имени (или ссылке, call-by-reference, CBR), однако ее реализация имеет две характерные особенности.
Во-первых, в случае вызова по необходимости значение фактического параметра не передается вызывающей функции, т.е. не происходит связывания переменной со значением.
Во-вторых, данная стратегия вычислений неприменима до того, как означивание может быть произведено, т.е. значение фактического параметра может быть вычислено.
Проиллюстрируем особенности использования стратегии вызова по необходимости следующим фрагментом программы на языке C#:
void Read (out int first, out int next) { first = Console.Read(); next = Console.Read(); } void f() { int first, next; Read(out first, out next); }
Как видно из приведенного примера, фрагмент программы на языке C# реализует ввод значений first и next посредством функции Read со стандартного устройства ввода. Функция f может быть означена по необходимости, по мере поступления аргументов.
Исследовав особенности реализации различных стратегий вычислений в языке программирования C#, рассмотрим концепцию полиморфизма в соотнесении с механизмом так называемых абстрактных классов.
Абстрактные классы при объектно-ориентированном подходе (в частности, в языке программирования C#) являются аналогами
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
122
полиморфных функций в языках функционального программирования (в частности, в языке SML) и используются для реализации концепции полиморфизма . Методы, которые реализуют абстрактные классы, также называются абстрактными и являются полиморфными.
Перечислим основные особенности, которыми обладают абстрактные классы и методы в рамках объектно-ориентированного подхода к программированию.
Прежде всего, отметим то обстоятельство, что абстрактные методы не имеют части реализации (implementation).
Кроме того, абстрактные методы неявно являются виртуальными (т.е. как бы оснащенными описателем virtual ).
В том случае, если внутри класса имеются определения абстрактных методов, данный класс необходимо описывать как абстрактный. Ограничений на количество методов внутри абстрактного класса в языке программирования C# не существует.
Наконец, в языке программирования C# запрещено создание объектов абстрактных классов (как конкретизаций или экземпляров ).
Проиллюстрируем особенности использования абстрактных классов следующим фрагментом программы на языке C#:
abstract class Stream { public abstract void Write(char ch); public void WriteString(string s) { foreach (char ch in s) Write(s); } }
class File : Stream { public override void Write(char ch) { ...
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
123
write ch to disk ... } }
Как видно из приведенного примера, фрагмент программы на языке C# представляет собой описание абстрактных классов Stream и File, реализующих потоковую запись (метод Write ) данных в форме символьных строк ch.
Заметим, что описание абстрактного класса Stream реализовано явно посредством зарезервированного слова abstract. Оператор
foreach ... in реализует последовательную обработку элементов.
Необходимо обратить внимание на то обстоятельство, что поскольку в производных классах необходимо замещение методов, метод Write класса File оснащен описателем override.
Подводя итоги рассмотрения основных аспектов концепции полиморфизма в объектно-ориентированном подходе к программированию и особенностей реализации этой концепции применительно к языку программирования C#, кратко отметим достоинства полиморфизма.
Прежде всего, к преимуществам концепции полиморфизма следует отнести унификацию обработки объектов различной природы. В самом деле, абстрактные классы и методы позволяют единообразно оперировать гетерогенными данными, причем для адаптации к новым классам и типам данных не требуется реализации дополнительного программного кода.
Кроме того, важным практическим следствием реализации концепции полиморфизма для экономики программирования является снижение стоимости проектирования и реализации программного обеспечения.
Еще одно достоинство полиморфизма - возможность усовершенствования стратегии повторного использования кода. Код с более высоким уровнем абстракции не требует существенной модификации при адаптации к изменившимся условиям задачи или
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
124
новым типам данных.
Важно также отметить, что идеология полиморфизма основана на строгом математическом фундаменте (в частности, в виде формальной системы ламбда-исчисления), что обеспечивает интуитивную прозрачность исходного текста для математически мыслящего программиста, а также верифицируемость программного кода.
Наконец, концепция полиморфизма является достаточно универсальной и в равной степени применима для различных подходов к программированию, включая функциональный и объектно­ориентированный.
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 23, 26, 53, 59,
62, 63, 74-76].
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
125
Полиморфные методы
Цель: Ознакомление с особенностями создания и применения полиморфных методов в языке программирования C#.
Теоретические сведения
Концепция полиморфизма
Понятие полиморфизма является одной из фундаментальных составляющих объектно-ориентированного программирования и позволяет определять в наследуемом классе методы, которые являются общими для всех наследующих классов. При этом наследующий класс может определять специфическую реализацию для некоторых (а возможно и всех) полиморфных методов. Важнейший принцип полиморфизма можно сформулировать фразой: "один интерфейс, несколько методов". Благодаря полиморфизму можно пользоваться методами, не обладая точными знаниями о типе объектов.
Основными механизмами для реализации концепции полиморфизма в ООП (в том числе, в языке C#) являются виртуальные методы и абстрактные классы.
Виртуальные методы
Метод, при определении которого в наследуемом классе было указано ключевое слово virtual и который был переопределен в одном или более наследующих классах, называется виртуальным методом. Следовательно, каждый наследующий класс может иметь собственную конкретизацию виртуального метода.
Выбор конкретизации виртуального метода, которая будет использована, осуществляется в соответствии с типом объекта, на который указывает ссылочная переменная во время выполнения программы. Другими словами, именно тип объекта, на который указывает ссылка (а не тип ссылочной переменной), определяет вызываемую версию виртуального
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
126
метода. Таким образом, если класс содержит виртуальный метод и от этого класса были унаследованы другие классы, в которых определены свои версии метода, при ссылке переменной типа наследуемого класса на различные типы объектов вызываются различные версии виртуального метода.
При определении виртуального метода в составе наследуемого класса перед типом возвращаемого значения указывается ключевое слово
virtual, а при переопределении виртуального метода в наследующем
классе используется модификатор override. В определении виртуального метода недопустимо использование модификаторов
static и abstract.
Виртуальный метод не обязательно должен быть переопределенным (
overridden ). Если наследующий класс не предоставляет
собственную версию виртуального метода, то используется метод наследуемого класса.
Переопределение метода положено в основу концепции динамического выбора вызываемого метода. Выбор вызываемого переопределенного метода осуществляется во время выполнения программы, а не во время ее компиляции.
Описание абстрактного метода
Синтаксис:
virtual тип имя (список_параметров) {тело_метода};
Абстрактные классы
В абстрактном классе определяются лишь общие предназначения методов, которые должны быть реализованы в наследующих классах. Сам по себе абстрактный класс не содержит таких методов, называемых абстрактными (для них определены только отдельные характеристики, в частности, тип возвращаемого значения, имя и список параметров).
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
127
Для объявления абстрактного метода используется модификатор
abstract. Поскольку абстрактный метод неявно является
виртуальным, модификатор virtual при объявлении такого метода не используется.
Абстрактные классы предназначены исключительно для создания иерархии классов, поэтому запрещено создание объектов абстрактного класса.
Описание абстрактного класса
Синтаксис:
abstract class имя {тело_класса};
Пример:
abstract class Animal { public string Name; protected int Weight; private int Type; abstract void Feed(); public int Animal(int W, int T, string N) { Weight=W; Type=T; Name=N; } public int GetWeight(){ return Weight; } } class Predator:Animal { private int Speed; override void Feed(int Food){ Weight += Food;
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
128
} }
Порядок выполнения работы
1. Изменить иерархию классов и реализовать ее на С#.
2. Показать на примере одного из методов, присутствующих в каждом классе, свойство полиморфизма.
Варианты заданий
Расширить иерархию классов из лабораторной работы №7 с использованием виртуального класса в качестве основы иерархии. Показать пример использования полиморфизма методов.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
129
Расширенные возможности полиморфизма в языке C#
В данной лекции будут рассмотрены вопросы, относящиеся к идеологии, математическому основанию и обзору расширенных возможностей полиморфизма - одной из фундаментальных концепций, на которых основано объектно-ориентированное программирование.
Предыдущая лекция была посвящена базовым аспектам полиморфизма. Обсудим более тонкие механизмы, предусмотренные в языке C# для реализации сложных полиморфных объектов.
Проиллюстрируем особенности использования абстрактных свойств и методов следующим фрагментом программы на языке C#:
abstract class Sequence { public abstract void Add(object x); // метод public abstract string Name{ get; } // свойство public abstract object this [int i] { get; set; } // индексатор }
class List : Sequence { public override void Add(object x) { ... }
public override string Name { get { ...
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]