Uploaded by Юлия Yulia

lab lang

advertisement
Министерство образования Российской Федерации
Московский инженерно-физический институт
(государственный университет)
Факультет “Информационная Безопасность”
Кафедра “Криптология и Дискретная математика”
Лабораторные работы
по курсу
«Современные языки программирования
и платформа .NET»
2 семестр
Москва - 2003
2
СОДЕРЖАНИЕ
Введение
3
Необходимое программное обеспечение
4
Установка компилятора MSL.NET
5
Лабораторная работа 1: Разработка элементарных программ на языке
программирования C#
7
Лабораторная работа 2: Объекты и классы (наследование, конструкторы,
деструкторы) .
12
Лабораторная работа 3: Программирование полиморфных методов.
Лабораторная
работа
программирования.
Лабораторная
мирование.
работа
4:
5:
Расширенные
возможности
Событийно-ориентированное
17
языка
21
програм25
Лабораторная работа 6: Проектирование и реализация гетерогенных
приложений
31
Список литературы и учебных материалов
Приложение 1. Особенности инсталляции
разработки Microsoft Visual Studio .NET
34
интегрированной
среды
35
3
Введение
Целью данного практикума является получение практических навыков
прикладного
программирования,
в
сопоставлении
объектноориентированного подхода (ООП) к проектированию и реализации
программного обеспечения с функциональным подходом, на единой
универсальной платформе разработки приложений Microsoft .NET.
В задачи настоящего лабораторного практикума входит освоение таких
основополагающих концепций ООП, как абстракция, наследование,
инкапсуляция и полиморфизм. Разработка приложений носит сравнительный
характер и иллюстрируется языками функционального (SML) и объектноориентированного (C#) программирования и в среде Microsoft Visual Studio
.NET.
Важным разделом практикума является исследование систем типизации
среды .NET, а также языков SML и C#. При этом наибольшее внимание
уделяется таким важным аспектам, как пространства имен, абстрактные типы
данных, классы и методы.
Вопросы, связанные с событийно-управляемым программированием,
завершают курс. Краткое введение в теорию обработки событий
сопровождается рядом примеров из практики программирования на языке
C#. Отдельно исследуется обработка исключительных ситуаций
В результате освоения курса читатели получают возможность
самостоятельной разработки широкого спектра прикладных программных
решений в условиях современной гетерогенной компонентной архитектуры.
При этом начинающие программисты смогут осуществить осознанный выбор
из всего многообразия современных методов и тенденций в разработке
приложений того из подходов, который обеспечит практически эффективную
(по срокам и стоимости) реализацию прикладной системы или отдельных ее
компонент.
4
Необходимое программное обеспечение
Для выполнения лабораторных работ настоящего практикума
необходимо следующее программное обеспечение:
1) 32-разрядная операционная система Microsoft Windows 98, ME, 2000,
XP, 2003.
2) Интегрированная среда разработки Microsoft Visual Studio .NET
3) Средство разработки SML.NET (для выполнения лабораторной
работы №6).
Код SML.NET может быть также откомпилирован на следующем
программном обеспечении:
1) 32-разрядная операционная система Microsoft Windows 98, ME или
2000, XP, 2003.
2) Платформа разработки Microsoft.NET Framework SDK или
Microsoft.NET Framework Redistr.
3) Средство разработки SML.NET.
5
Процедура установки SML.NET
Для установки SML.NET в интегрированную среду разработки Visual
Studio.NET требуется:
1.
Распаковать файлы архива smlnet.tar.gz в директорию, куда Вы
хотите
установить
компилятор
SML.NET
(например,
C:\smlnet)
2.
Запустить файл install.exe в корневой директории компилятора.
(Внимание! После выполнения данной процедуры нельзя
перемещать файлы компилятора в другую директорию для
обеспечения корректной работы среды разработки)
3.
Выполнить повторный вход в систему (в отдельных случаях
может понадобится перезагрузка системы) для принятия
изменений в переменных окружения.
После выполнения данных процедур в меню создания проектов Visual
Studio должен появиться выбор проектов SML.NET:
Для проверки правильности установки откройте пример решения,
находящийся по адресу “Директория, где установлен компилятор
SML.NET”/vs/demo/Life/Demo.sln и выполните его сборку
В
текущей
версии
поставки
перед
выполнением
сборки
демонстрационного примера необходимо вручную указать тип проекта –
“Клиент”. Для этого в окне Solution Explorer щелкните правой кнопкой мыши
6
на пункте Client Project и выберите в выпадающем меню пункт Set as Startup
Project.
При правильной инсталляции сборка должна выполнится без ошибок, и
при запуске решения должно появиться окно математической игры “Жизнь”.
Для компиляции приложений на SML.NET также возможна установка
для работы с .NET Framework. При этом требуется:
1. Распаковать файлы архива smlnet.tar.gz в директорию, куда Вы
хотите установить компилятор SML.NET (например, C:\smlnet )
2. Установить переменную окружения SMLNETPATH = “Директория,
где находятся файлы компилятора SML.NET” (например,
C:\smlnet )
3. Добавить к переменной окружения PATH путь к директории с
исполняемыми файлами SML.NET (например, C:\smlnet\bin )
Старт компилятора осуществляется запуском файла smlnet.bat
находящимся в директории с исполняемыми фалами. Для проверки
правильности установки можно ввести следующие команды
source demos\sort
export Sort
make
run
7
Лабораторная работа 1: Разработка элементарных программ
на языке программирования C#
Цель работы:
Познакомиться с базовыми особенностями языка программирования C#
и разработки программ с использованием среды Visual Studio.
Необходимые теоретические сведения
Краткие сведения о платформе .NET
Платформа .NET Framework определяет среду для поддержки создания и
выполнения платформонезависимых гетерогенных приложений. Основными
особенностями данной платформы являются не зависящая от языка среда
исполнения (Common Language Runtime, CLR) и библиотека классов .NET
Основа языка C#
Обьявление и инициализация переменных:
Тип_переменной имя_переменной [=значение];
Примеры:
int x; //обьявление переменной x
x=100; //инициализация переменной x
long w,z=100; //обьявление переменных w и z и
//инициализация z
long q=100*z; //обьявление переменной с динамической
//инициализацией
C# - язык со строгим контролем типов данных. Есть 2 основные
категории встроенных типов данных в C# - простые типы и ссылочные типы.
Основные простые типы данных в C#:
тип
Описание
бит
bool
Значение истина/ложь
1
byte
8-битовое беззнаковое целое
8
char
Символ
16
decimal Числовой тип для финансовых вычислений
128
double Число двойной точности с плавающей точкой
64
float
Число с плавающей точкой
32
int
Знаковое целое
32
long
Длинное знаковое целое
64
sbyte
8-битовое знаковое целое
8
short
Короткое целое
16
uint
Беззнаковое целое
32
ulong
Беззнаковое длинное целое
64
8
ushort
Беззнаковое короткое целое
16
Область видимости переменной в C# - блок кода (заключенный в
фигурные скобки {}). Переменная создается при входе в область видимости и
уничтожаются при выходе из нее.
Основные управляющие операторы:
Условный:
if (условие) оператор [else оператор];
if (условие1) оператор1;
else if (условие2) оператор2;
else if (условие3) оператор3;
…
Выбора:
switch (выражение){
case константа1:
оператор1;
…
break;
case константа2:
операторX1;
…
break;
…
default:
операторZ1;
…
break;
}
Цикла:
for(инициализация, условие_выхода, итерация) оператор;
while (условие_продолжения) оператор;
do оператор; while (условие продолжения);
Пространство имен:
Пространство имен определяет область объявления, что позволяет
хранить каждый набор имен отдельно от других наборов. В С# имена,
объявленные в одном пространстве имен, не конфликтуют с такими же
9
именами, объявленными в другом пространстве имен. Библиотекой .NET
Framework (библиотекой С#) используется пространство имен System.
Для того, чтобы чтобы сделать видимыми пространства имен без
указания полного имени (через ‘.’) используется директива using
Синтаксис:
using имя_пространства_имен;
также возможно использование псевдонимов для имен
using псевдоним = имя;
Пространство имен объявляется
namespace.
Синтаксис:
namespace имя {
члены_пространства_имен}
с
помощью
ключевого
слова
Пример программы на C#
Программа ‘Hello, World’ на языке C# выглядит следующим образом:
using System;
class HelloWorld01
{
public static void Main()
{
Console.Write("Hello, World!");
Console.ReadLine();
}
}
Контрольные вопросы
1. Что понимается под термином «.NET Framework»?
2. Зависят ли приложения, разрабатываемые в .NET, от платформы?
3. Возможно ли создание гетерогенных приложений в среде .NET?
4. Что означает аббревиатура «CLR»?
5. Является ли среда CLR многоязычной?
6. Приведите обобщенный синтаксис объявления переменной на языке
C#.
7. Приведите обобщенный синтаксис инициализации переменной на
языке C#.
10
8. Какая дисциплина (вариант контроля) типов принята в языке C#?
9. Каковы основные категории типов в языке C#?
10. Перечислите пять простых типов языка C#.
11. Что понимается под областью видимости переменной в языке C#?
12. Как обозначается область видимости переменной в языке C#?
13. Как соотносится время жизни переменной и область видимости?
14. Приведите синтаксис условного оператора в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
15. Приведите синтаксис оператора выбора в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
16. Что понимается под термином «пространство имен»?
17. В чем состоит назначение пространств имен в языке C#?
18. Благодаря какому механизму удается избежать коллизий имен в
языке C#?
19. Какое пространство имен использует системная библиотека .NET
Framework?
20. Какое пространство имен использует системная библиотека C#?
21. В чем состоит назначение директивы using?
22. Какой символ используется для указания полного имени объекта в
языке C#?
23. Приведите синтаксис директивы using в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
24. Приведите синтаксис описания пространства имен в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
Варианты заданий
Написать C# программу, реализующую функцию согласно варианту
задания. Исходные данные вводятся с клавиатуры.
1. Реализовать функцию вычисления суммы двух целых чисел
2. Реализовать функцию вычисления разности двух целых чисел
3. Реализовать функцию вычисления произведения двух целых чисел
4. Реализовать функцию вычисления частного двух целых чисел
5. Реализовать функцию вычисления суммы двух вещественных чисел
6. Реализовать функцию вычисления разности двух вещественных
чисел
7. Реализовать функцию вычисления произведения двух вещественных
чисел
8. Реализовать функцию вычисления частного двух
вещественных
чисел
9. Реализовать функцию возведения целого числа в квадрат
10. Реализовать функцию возведения в квадрат суммы двух целых
чисел
11
11. Реализовать функцию возведения в квадрат разности двух целых
чисел
12. Реализовать функцию возведения в квадрат произведения двух
целых чисел
13. Реализовать функцию возведения в квадрат частного двух целых
чисел
14. Реализовать функцию возведения в квадрат суммы двух
вещественных чисел
15. Реализовать функцию возведения в квадрат разности двух
вещественных чисел
16. Реализовать функцию возведения в квадрат произведения двух
вещественных чисел
17. Реализовать функцию возведения в квадрат частного двух
вещественных чисел
18. Реализовать функцию возведения в куб целого числа
28. Реализовать функцию возведения в куб суммы двух целых чисел
20. Реализовать функцию возведения в куб разности двух целых чисел
21. Реализовать функцию возведения в куб произведения двух целых
чисел
22. Реализовать функцию возведения в куб частного двух целых чисел
23. Реализовать функцию возведения в куб суммы двух вещественных
чисел
24. Реализовать функцию возведения в куб разности двух
вещественных чисел
25. Реализовать функцию возведения в куб произведения двух
вещественных чисел
26. Реализовать функцию возведения в куб частного двух
вещественных чисел
Порядок выполнения работы:
1) Реализовать программу на C# в соответствии с вариантом
исполнения.
2) Сравнить программу на SML и на C#.
3) Подготовить отчет в твердой копии и в электронном виде.
12
Лабораторная работа 2: Объекты и классы (наследование,
конструкторы, деструкторы).
Цель работы:
Познакомиться с основой объектного подхода в языке C#, созданием
объектов, классов и механизмом наследования.
Необходимые теоретические сведения
Классы и обьекты
Класс является основой для создания объектов. В классе определяются
данные и код, который работает с этими данными. Объекты являются
экземплярами класса.
Методы и переменные, составляющие класс, называются членами
класса. При определении класса объявляются данные, которые он содержит,
и код, работающий с этими данными. Данные содержатся в переменных
экземпляра, которые определены классом, а код содержится в методах. В С#
определены несколько специфических разновидностей членов класса. Это —
переменные экземпляра, статические переменные, константы, методы,
конструкторы, деструкторы, индексаторы, события, операторы и свойства.
Непосредственно инициализация переменных в объекте (переменных
экземпляра) происходит в конструкторе. В классе могут быть определены
несколько конструкторов.
Синтаксис класса:
class имя_класса{
тип_доступа тип имя_переменной1;
тип_доступа тип имя_переменной2;
…
тип_доступа возвращаемый_тип
имя_метода1(список_параметров) {тело_метода}
}
где тип_доступа может быть public, private, protected, internal.
Члены класса с типом доступа public доступны везде за пределами данного
класса, с типом доступа protected – внутри членов данного класса и
производных, с типом доступа private - только для других членов данного
класса. Тип доступа internal применяется для типов, доступных в
пределах одной сборки.
Пример:
class Animal{
public string Name;
private int Weight;
13
protected int Type;
public int Animal(int W, int T, string N){
Weight=W;
Type=T;
Name=N;
}
public int GetWeight(){return Weight;}
}
Создание обьекта
имя_класса имя_обьекта
= new имя_класса();
При создании обьекта класса происходит вызов соответствующего
конструктора класса.
Конструктор и деструктор
Конструктор класса – метод для инициализации объекта при его
создании. Он имеет то же имя, что и его класс. В конструкторах тип
возвращаемого значения не указывается явно. Конструкторы используются
для присваивания начальных значений переменным экземпляра,
определенным классом, и для выполнения любых других процедур
инициализации, необходимых для создания объекта.
Все классы имеют конструкторы независимо от того, определен он или
нет. По умолчанию в С# предусмотрено наличие конструктора, который
присваивает нулевые значения всем переменным экземпляра (для
переменных обычных типов) и значения null (для переменных ссылочного
типа). Но если конструктор явно определен в классе, то конструктор по
умолчанию использоваться не будет.
имя_класса(список_параметров) {тело_конструктора}
Деструктор – метод, вызывающийся автоматически при уничтожении
обьетка класса (непосредственно перед “сборкой мусора”). Деструктор не
имеет параметров и возвращаемого значения.
~имя_класса() {тело_деструктора}
Наследование
Наследование — это свойство, с помощью которого один объект может
приобретать свойства другого. При этом поддерживается концепция
иерархической классификации, имеющей направление сверху вниз.
Используя наследование, объект должен определить только те качества,
которые делают его уникальным в пределах своего класса. Он может
наследовать общие атрибуты от своих родительских классов.
14
Синтаксис:
class
имя_класса
{тело_класса}
:
имя_родительского_класса
Пример:
class Predator:Animal{
private int Speed;
}
С помощью наследования создается иерархия классов (отношение
‘являться’). Кроме того, можно построить еще одну структуру – иерархию
объектов (тогда, когда один объект является частью другого – отношение
‘часть-целое’).
Контрольные вопросы
1) Что понимается под термином «класс»?
2) Какие элементы определяются в составе класса?
3) Каково соотношение понятий «класс» и «объект»?
4) Что понимается под термином «члены класса»?
5) Какие члены класса Вам известны?
6) Какие члены класса содержат код?
7) Какие члены класса содержат данные?
8) Перечислите пять разновидностей членов класса специфичных для
языка C#.
9) Что понимается под термином «конструктор»?
10)
Сколько конструкторов может содержать класс языка C#?
11)
Приведите синтаксис описания класса в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
12)
Какие модификаторы типа доступа Вам известны?
13)
В чем заключаются особенности доступа членов класса с
модификатором public?
14)
В чем заключаются особенности доступа членов класса с
модификатором private?
15)
В чем заключаются особенности доступа членов класса с
модификатором protected?
16)
В чем заключаются особенности доступа членов класса с
модификатором internal?
17)
Какое ключевое слово языка C# используется при создании
объекта?
18)
Приведите синтаксис создания объекта
в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
19)
В чем состоит назначение конструктора?
20)
Каждый ли класс языка C# имеет конструктор?
21)
Какие умолчания для конструкторов приняты в языке C#?
15
22)
Каким значением инициализируются по умолчанию значения
ссылочного типа?
23)
В каком случае конструктор по умолчанию не используется?
24)
Приведите синтаксис конструктора класса в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
25)
Что понимается под термином «деструктор»?
26)
В чем состоит назначение деструктора?
27)
Приведите синтаксис деструктора класса в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
28)
Имеет ли деструктор параметры?
29)
Возвращает ли деструктор значение?
30)
Что понимается под термином «наследование»?
31)
Какая классификация объектов соответствует наследованию?
32)
Что общего имеет дочерний класс с родительским?
33)
В чем состоит различие между дочерним и родительским
классами?
34)
Приведите синтаксис описания наследования классов в общем
виде. Проиллюстрируйте его фрагментом программы на языке C#.
35)
Какому отношению соответствует иерархия классов?
36)
Какому отношению соответствует иерархия объектов?
Варианты заданий
Построить иерархию классов в соответствии с вариантом задания:
1) Студент, преподаватель, персона, заведующий кафедрой
2) Служащий, персона, рабочий, инженер
3) Рабочий, кадры, инженер, администрация
4) Деталь, механизм, изделие, узел
5) Организация, страховая компания, нефтегазовая компания, завод
6) Журнал, книга, печатное издание, учебник
7) Тест, экзамен, выпускной экзамен, испытание
8) Место, область, город, мегаполис
9) Игрушка, продукт, товар, молочный продукт
10)
Квитанция, накладная, документ, счет
11)
Автомобиль, поезд, транспортное средство, экспресс
12)
Двигатель, двигатель внутреннего сгорания, дизель, реактивный
двигатель
13)
Республика, монархия, королевство, государство
14)
Млекопитающее, парнокопытное, птица, животное
15)
Корабль, пароход, парусник, корвет
16
Порядок выполнения работы:
1) Разработать методы и свойства для каждого из определяемых
классов.
2) Реализовать программу на C# в соответствии с вариантом
исполнения.
3) Подготовить отчет в твердой копии и в электронном виде.
17
Лабораторная работа 3: Программирование полиморфных
методов.
Цель работы:
Познакомиться с программированием полиморфных методов при
объектно-ориентированном подходе при использовании языка C#.
Необходимые теоретические сведения
Полиморфизм
Полиморфизм – одна из основных составляющих объектноориентированного
программирования,
позволяющая
определять
в
наследуемом классе методы, которые будут общими для всех наследующих
классов, при этом наследующий класс может определять специфическую
реализацию некоторых или всех этих методов. Главный принцип
полиморфизма: «один интерфейс, несколько методов». Благодаря ему, можно
пользоваться методами, не обладая точными знаниями о типе объектов.
Основным инструментом для реализации принципа полиморфизма
является использование виртуальных методы и абстрактных классов.
Виртуальные методы
Метод, при определении которого в наследуемом классе было указано
ключевое слово virtual, и который был переопределен в одном или более
наследующих классах, называется виртуальным методом. Следовательно,
каждый наследующий класс может иметь собственную версию виртуального
метода.
Выбор версии виртуального метода, которую требуется вызвать,
осуществляется в соответствии с типом объекта, на который ссылается
ссылочная переменная, во время выполнения программы. Другими словами,
именно тип объекта, на который указывает ссылка (а не тип ссылочной
переменной), определяет вызываемую версию виртуального метода. Таким
образом, если класс содержит виртуальный метод и от этого класса были
наследованы другие классы, в которых определены свои версии метода, при
ссылке переменной типа наследуемого класса на различные типы объектов
вызываются различные версии виртуального метода.
При определении виртуального метода в составе наследуемого класса
перед типом возвращаемого значения указывается ключевое слово virtual,
а при переопределении виртуального метода в наследующем классе
используется модификатор override. Виртуальный метод не может быть
определен с модификатором static или abstract.
Переопределять виртуальный метод не обязательно. Если наследующий
класс не предоставляет собственную версию виртуального метода, то
используется метод наследуемого класса.
18
Переопределение метода положено в основу концепции динамического
выбора вызываемого метода - выбора вызываемого переопределенного
метода осуществляется во время выполнения программы, а не во время
компиляции.
Синтаксис:
virtual тип имя (список_параметров){тело_метода};
Пример:
Абстрактные классы
В абстрактном классе определяются лишь общие предназначения
методов, которые должны быть реализованы в наследующих классах, но сам
по себе этот класс не реализует один, или несколько подобных методов,
называемых абстрактными (для них определены только некоторые
характеристики, такие как тип возвращаемого значения, имя и список
параметров).
При объявлении абстрактного метода используется модификатор
abstract. Абстрактный метод автоматически становится виртуальным, так
что модификатор virtual при объявлении метода не используется.
Абстрактный класс предназначен только для создания иерархии классов,
нельзя создать объект абстрактного класса.
Пример:
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;}
}
19
Контрольные вопросы
1) Что понимается под термином «полиморфизм»?
2) В чем состоит основной принцип полиморфизма?
3) В чем состоит значение основного принципа полиморфизма?
4) Какие механизмы используются в языке C# для реализации концепции
полиморфизма?
5) Что понимается под термином «виртуальный метод»?
6) Какое ключевое слово языка C# используется для определения
виртуального метода?
7) В чем состоит особенность виртуальных методов в производных
(дочерних) классах?
8) В какой момент трансляции программы осуществляется выбор версии
виртуального метода?
9) Какие условия определяют выбор версии виртуального метода?
10)
Какое ключевое слово (модификатор) языка C# используется для
определения виртуального метода в базовом (родительском) классе?
11)
Какое ключевое слово (модификатор) языка C# используется для
определения виртуального метода в производном (дочернем) классе?
12)
Какие
модификаторы
недопустимы
для
определения
виртуальных методов?
13)
Что означает термин «переопределенный метод»?
14)
В какой момент трансляции программы осуществляется выбор
вызываемого переопределенного метода?
15)
Приведите синтаксис виртуального метода в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
16)
Что понимается под термином «абстрактный класс»?
17)
В чем заключаются особенности абстрактных классов?
18)
Какой модификатор языка C# используется при объявлении
абстрактных методов?
19)
Являются ли абстрактные методы виртуальными?
20)
Используется ли модификатор virtual языка C# при объявлении
абстрактных методов?
21)
Возможно ли создание иерархии классов посредством
абстрактного класса?
22)
Возможно ли создание объектов абстрактного класса?
23)
Приведите синтаксис абстрактного класса в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
Варианты заданий
Расширить иерархию классов из лабораторной работы №2 с использованием
виртуального класса в качестве основы иерархии. Показать пример
использования полиморфизма методов.
20
Порядок выполнения работы:
1) Изменить иерархию классов и реализовать ее на С#.
2) Показать на примере одного из методов, присутствующих в каждом
классе, свойство полиморфизма.
3) Подготовить отчет в твердой копии и в электронном виде.
21
Лабораторная работа 4: Расширенные возможности языка
программирования C#.
Цель работы:
Познакомиться
с
расширенными
возможностями
программирования C#, такими, как интерфейсы и делегаты.
языка
Необходимые теоретические сведения
Интерфейсы
В C# для полного отделения структуры класса от его реализации
используется механизм интерфейсов.
Интерфейс является расширением идеи абстрактных классов и методов.
Синтаксис интерфейсов подобен синтаксису абстрактных классов.
Объявление интерфейсов выполняется с помощью ключевого слова
interface. При этом методы в интерфейсе не поддерживают реализацию.
Членами интерфейса могут быть методы, свойства, индексаторы и
события.
Интерфейс может реализовываться произвольным количеством классов.
Один класс, в свою очередь, может реализовывать любое число интерфейсов.
Каждый класс, включающий интерфейс, должен реализовывать его
методы. В интерфейсе для методов неявным образом задается тип public. В
этом случае также не допускается явный спецификатор доступа.
Синтаксис:
[атрибуты] [модификаторы] interface
Имя_интерфейса[:список_родительских_интерфейсов] {
обьявление_свойств_и_методов}
Пример:
interface Species
{
string Species();
void Feed();
}
class Cheetah:Animal,Species{
private string ScientificName;
public string Species()
{return ScientificName;}
public void Feed()
{Weight++;}
}
22
Можно объявлять ссылочную переменную, имеющую интерфейсный
тип. Подобная переменная может ссылаться на любой объект, который
реализует ее интерфейс. При вызове метода объекта с помощью
интерфейсной ссылки вызывается версия метода, реализуемого данным
объектом.
Возможно наследование интерфейсов. В этом случае используется
синтаксис, аналогичный наследованию классов. Если класс реализует
интерфейс, который наследует другой интерфейс, должна обеспечиваться
реализация для всех членов, определенных в составе цепи наследования
интерфейсов.
Делегаты
Делегат — это объект, имеющий ссылку на метод. Делегат позволяет
выбрать вызываемый метод во время выполнения программы. Фактически
значение делегата – это адрес области памяти, где находится точка входа
метода.
Важным свойством делегата является то, что он позволяет указать в
коде программы вызов метода, но фактически вызываемый метод
определяется во время работы программы, а не во время компилирования.
Делегат объявляется с помощью ключевого слова delegate, за которым
указывается тип возвращаемого значения, имя делегата и список параметров
вызываемых методов.
Синтаксис:
delegate
тип_возвращаемого_значения
(список_параметров);
имя_делегата
Xарактерной особенностью делегата является возможность его
использования для вызова любого метода, который соответствует подписи
делегата. Это дает возможность определить во время выполнения
программы, какой из методов должен быть вызван. Вызываемый метод
может быть методом экземпляра, ассоциированным с объектом, либо
статическим методом, ассоциированным с классом. Метод можно вызвать
только тогда, когда его подпись соответствует подписи делегата.
Многоадресность делегатов
Многоадресность — это способность делегата хранить несколько
ссылок на различные методы, что позволяет при вызове делегата
инициировать эту цепочку методов.
Для создания цепочки методов необходимо создать экземпляр делегата,
и пользуясь операторами + или += добавлять методы к цепочке. Для
удаления метода из цепочки используется оператор - или -=. Делегаты,
23
хранящие несколько ссылок, должны иметь тип возвращаемого значения
void.
Контрольные вопросы
1) Что понимается под термином «интерфейс»?
2) Чем отличается синтаксис интерфейса от синтаксиса абстрактного
класса?
3) Какое ключевое слово языка C# используется для описания
интерфейса?
4) Поддерживают ли реализацию методы интерфейса?
5) Какие объекты языка C# могут быть членами интерфейсов?
6) Каким количеством классов может быть реализован интерфейс?
7) Может ли класс реализовывать множественные интерфейсы?
8) Необходима ли реализация методов интерфейса в классе, включающем
этот интерфейс?
9) Какой модификатор доступа соответствует интерфейсу?
10)
Допустимо ли явное указание модификатора доступа для
интерфейса?
11)
Приведите
синтаксис
интерфейса
в
общем
виде.
Проиллюстрируйте его фрагментом программы на языке C#.
12)
Возможно ли создание ссылочной переменной интерфейсного
типа?
13)
Возможно ли наследование интерфейсов?
14)
Насколько синтаксис наследования интерфейсов отличается от
синтаксиса наследования классов?
15)
Необходимо ли обеспечение реализации в иерархии наследуемых
интерфейсов?
16)
Что понимается под термином «делегат»?
17)
В чем состоят преимущества использования делегатов?
18)
В какой момент осуществляется выбор вызываемого метода в
случае использования делегатов?
19)
Что является значением делегата?
20)
Какое ключевое слово языка C# используется для описания
делегатов?
21)
Приведите синтаксис делегата в общем виде. Проиллюстрируйте
его фрагментом программы на языке C#.
22)
Возможно ли использование делегата для вызова метода,
соответствующего подписи делегата?
23)
Возможен ли вызов метода в том случае, если его подпись не
соответствует подписи делегата?
24)
Что понимается под термином «многоадресность»?
25)
В чем состоит практическое значение многоадресности?
26)
Каким образом осуществляется создание цепочки методов для
многоадресных делегатов?
24
27)
Какие операторы языка C# используются для создания цепочки
методов для многоадресных делегатов?
28)
Каким образом осуществляется удаление цепочки методов для
многоадресных делегатов?
29)
Какие операторы языка C# используются для удаления цепочки
методов для многоадресных делегатов?
30)
Каким должен быть тип возвращаемого значения для
многоадресных делегатов?
Варианты заданий
Реализовать для иерархии из лабораторной работы №3 механизм
интерфейсов, при этом один из классов должен реализовывать как минимум
2 интерфейса. Использовать для проверки всех методов данного класса
многоадресный делегат.
Порядок выполнения работы:
1) Реализовать программу на C# в соответствии с вариантом
исполнения.
2) Подготовить отчет в твердой копии и в электронном виде.
25
Лабораторная работа 5: Событийно-ориентированное
программирование.
Цель работы:
Познакомиться
с
механизмами
событийно-ориентированного
программирования на языке C#, такими как механизм обработки событий и
исключительные ситуации.
Необходимые теоретические сведения
Обработка событий
Событие — это автоматическое извещение о каком-либо произошедшем
действии. События являются членами класса и объявляются с
использованием ключевого слова event. Механизм событий основан на
использовании делегатов.
Синтаксис:
event имя_делегата имя_обьекта;
Широковещательные события
События могут активизировать несколько обработчиков, в том числе те,
что определены в других объектах. Такие события называются
широковещательными. Широковещательные события создаются на основе
многоадресных делегатов.
Пример:
// Объявление делегата, на основе которого будет
// определено событие.
delegate void MyEventHandler () ;
// Объявление класса, в котором инициируется событие.
class MyEvent
{
public event MyEventHandler activate;
// В этом методе инициируется событие.
public void fire()
{ if (activate != null) activate(); }
}
class X
{
26
public void Xhandler()
{
Console.WriteLine("Событие получено объектом класса
X.");
}
}
class Y
{
public void Yhandler()
{
Console.WriteLine("Событие получено объектом
класса Y.");
}
}
class EventDemo
{
static void handler()
{
Console.WriteLine("Событие получено объектом
класса EventDemo.")
}
public static void Main()
{
MyEvent evt = new MyEvent();
X xOb = new X();
Y yOb = new Y();
// Добавление методов handler (), Xhandler()
// и Yhandler() в цепочку обработчиков события.
evt.activate += new MyEventHandler(handler);
evt.activate += new MyEventHandler(xOb.Xhandler);
evt.activate += new MyEventHandler(yOb.Yhandler);
evt.fire();
Console.WriteLine();
evt.activate -= new MyEventHandler(xOb.Xhandler);
evt.fire();
}
}
27
Исключительные ситуации
Исключение представляет собой ошибку, происходящую во время
выполнения программы. С помощью подсистемы обработки исключений для
С# можно обрабатывать такие ошибки, не вызывая краха программы.
Обработка исключений в С# выполняется с применением четырех
ключевых слов: try, catch, throw и finally. Эти ключевые слова
образуют взаимосвязанную подсистему, в которой использование одного из
ключевых слов влечет за собой использование других.
Основа обработки исключений основана на использовании блоков try и
catch.
Синтаксис:
try {
Блок_кода_для_которого_выполняется_мониторинг_ошибок
catch
(ExcepTypel
ехОЬ)
{
Обработчик_исключений_ExcepTypel }
catch (ЕхсерТуре2 ехОЬ) {
Обработчик_исключений_ЕхсерТуре2 }
Основные системные исключения приведены в следующей таблице:
Исключение
Значение
ArrayTypeMismatchException Тип
сохраненного
значения
несовместим с типом массива.
DivideByZeroException
Предпринята попытка деления на
ноль.
IndexOutOfRangeException
Индекс массива выходит за пределы
диапазона.
InvalidCastException
Некорректное преобразование в
процессе выполнения.
OutOfMemoryException
Вызов new был неудачным из-за
недостатка памяти.
OverflowException
Переполнение при выполнении
арифметической операции.
StackOverflowException
Переполнение стека.
Тип исключения в операторе catch должен соответствовать типу
перехватываемого исключения. Неперехваченное исключение непременно
приводит к досрочному прекращению выполнения программы.
Для выполнения перехвата исключений вне зависимости от их типа
(перехват всех исключений) возможно использование catch без параметров.
Возврат из исключения
Так как оператор catch не вызывается из программы, то после
выполнения блока catch управление не передается обратно оператору
28
программы, при выполнении которого возникло исключение. Выполнение
программы продолжается с операторов, находящихся после блока catch.
С целью предотвращения этой ситуации возможно указание блока кода,
который вызывается после выхода из блока try/catch, с помощью блока
finally в конце последовательности try/catch. Общая форма
конструкции try/catch, включающей блок finally, показана ниже:
try {
// Блок кода, выполняющий мониторинг ошибок }
catch (ExcepTypel ехОЫ) {
/I Обработка исключения ExcepTypel. }
catch (ЕхсерТуре2 ехОЬ2) {
II Обработка исключения ЕхсерТуре2 .
finally {
// Код блока finally. }
Блок finally будет вызываться независимо от того, появится
исключение или нет, и независимо от причин возникновения такового.
Генерация исключений
Исключения
автоматически
генерируются
системой.
Однако
исключение может быть сгенерировано и посредством оператора throw.
Синтаксис:
throw
exceptOb;
Исключение, перехваченное одним оператором catch, может
генерироваться повторно, благодаря чему оно может перехватываться
внешним оператором catch. Для этого указывается ключевое слово throw
без имени исключения.
Наследование классов исключений:
Можно создавать заказные исключения, выполняющие обработку
ошибок в пользовательском коде. Генерирование исключений не
представляет особых сложностей. Просто определите класс, наследуемый из
класса Exception. В качестве общего правила руководствуйтесь тем, что
определенные пользователем исключения наследуются из класса
АрplicationException, так как они представляют собой иерархию
зарезервированных исключений, связанных с приложениями. Наследуемые
классы не нуждаются в фактической реализации в каком-либо виде,
поскольку само их существование в системе типов данных позволяет
воспользоваться ими в качестве исключений.
29
Создаваемые пользователем классы исключений автоматически
получают доступные для них свойства и методы, определенные в классе
Exception.
Контрольные вопросы
1) Что понимается под термином «событие»?
2) Являются ли события членами классов?
3) Какое ключевое слово языка C# используется для описания событий?
4) На каком механизме языка C# основана поддержка событий?
5) Приведите синтаксис описания события в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
6) Что понимается под термином «широковещательное событие»?
7) На основе какого механизма языка C# строятся широковещательные
события?
8) Приведите синтаксис описания широковещательного события в общем
виде. Проиллюстрируйте его фрагментом программы на языке C#.
9) Что понимается под термином «исключительная ситуация
(исключение)»?
10)
В чем состоит значение механизма исключений в языке C#?
11)
Какие операторы языка C# используются для обработки
исключений?
12)
Какие операторы языка C# являются важнейшими для обработки
исключений?
13)
Приведите синтаксис блока try…catch в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
14)
Приведите пять видов основных системных исключений.
15)
Необходимо ли обеспечивать соответствие типов исключения в
операторе catch типу перехватываемого исключения?
16)
Что происходит в случае неудачного перехвата исключения?
17)
В каком случае возможно использование оператора языка C#
catch без параметров?
18)
Каким образом осуществляется возврат в программу после
обработки исключительной ситуации?
19)
Какой оператор языка C# используется для обеспечения возврата
в программу после обработки исключения?
20)
Приведите синтаксис блока finally (в составе оператора
try…catch) в общем виде. Проиллюстрируйте его фрагментом
программы на языке C#.
21)
Зависит ли вызов блока finally от наличия исключения?
22)
Какие способы генерации исключений Вам известны?
23)
Что является источником автоматически генерируемых (неявных)
исключений?
24)
Каким образом возможно осуществить явную генерацию
исключений?
30
25)
Какой оператор языка C# используется для явной генерации
исключений?
26)
Приведите синтаксис оператора throw в общем виде.
Проиллюстрируйте его фрагментом программы на языке C#.
27)
Каким образом осуществляется повторный перехват исключений
в языке C#?
28)
Возможно ли создавать специализированные исключения для
обработки ошибок в коде пользователя?
29)
Какой системный класс является базовым для создания
исключений?
30)
На основе какого системного класса осуществляется генерация
пользовательских исключений?
31)
Необходима ли явная реализация классов, наследуемых от
системных исключений?
32)
Каким образом обеспечивается обращение к свойствам и методам
системных исключений?
Варианты заданий
Реализовать обработку ошибок для лабораторной работы №4, при этом
переопределив с помощью наследования событие:
1) StackOverflowException
2) ArrayTypeMismatchException
3) DivideByZeroException
4) IndexOutOfRangeException
5) InvalidCastException
6) OutOfMemoryException
7) OverflowException
Порядок выполнения работы:
1) Реализовать программу на C# в соответствии с вариантом
исполнения.
2) Подготовить отчет в твердой копии и в электронном виде.
31
Лабораторная работа 6: Проектирование и реализация
гетерогенных приложений
Цель работы:
Познакомиться с проектированием и реализацией гетерогенных
приложений в рамках платформы .NET (проекты на SML и C#,
синтезирующие различные подходы к программированию).
Необходимые теоретические сведения
Гетерогенные приложения
Платформа программирования .NET изначально разрабатывалась для
построения приложений на компонентной основе, и обеспечения
независимости взаимодействия компонентов от языка, на котором они
написаны. Благодаря этому в рамках одного приложения могут быть
использованы компоненты, реализующие различные подходы к
программированию.
В качестве основной структурной единицы компонентного
программирования выступает решение (solution), которое может состоять из
сборок. Сборка представляет из себя управляемую динамическую
библиотеку .net dll или приложение. В каждом решении должна быть хотя
бы одна сборка.
Сборки связываются ссылками друг с другом. Ссылка (reference) – это
пространство имен из одной сборки, доступное в другой. После добавления
дополнительного проекта к решению и ссылки к основному проекту в коде
основного
проекта
можно
пользоваться
пространствами
имен
дополнительного.
Взаимодействие с SML.NET на компонентном уровне
Код SML.NET может создавать пространство имен, видимое в рамках
других приложений. Для этого в файле script.smlnet прописывается
директива export. Она экспортирует блок SML (объект, структуру) как
пространство имен .NET, которое может в свою очередь быть использовано в
любой сборке решения при добавлении соответствующей ссылки.
Синтаксис:
export имя1[, имя2 …]
При создании нового проекта SML.NET платформа автоматически
прописывает имя основной структуры проекта SML в создаваемый файл. В
случае добавления дополнительных файлов или создания дополнительных
экспортируемых структур экспортом надо управлять вручную.
В свою очередь для создания ссылки на другие проекты .NET в решении
для SML.NET необходимо добавить строку вида:
32
Синтаксис:
Reference файл_с_кодом_компонента_1 […]
Контрольные вопросы
1)
2) Что понимается под термином «компонент»?
3) На каком подходе к программированию основана технология .NET?
4) В чем состоит значение компонентного подхода?
5) Могут ли компоненты в составе проекта для .NET быть разработаны на
различных языках программирования?
6) Что понимается под термином «решение»?
7) Из каких элементов состоят решения?
8) Что понимается под термином «сборка»?
9) Каковы ограничения на количество сборок в составе решения?
10)
Что понимается под термином «ссылка»?
11)
В чем состоит назначение механизма ссылок?
12)
Каким образом ссылки связывают основной проект с
дополнительным?
13)
Возможно ли создание пространства имен, доступных из других
приложений?
14)
В чем состоит назначение директивы экспорта?
15)
В каком файле при работе с SML.NET хранится директива
экспорта?
16)
В
каких
сборках
решения
возможно
использовать
экспортированные данные,?
17)
Какие данные SML могут быть экспортированы?
18)
Какая директива реализует компонентный экспорт данных?
19)
Приведите синтаксис директивы компонентного экспорта данных
(export) в общем виде. Проиллюстрируйте его фрагментом программы
на языке C#.
20)
В каких случаях SML.NET осуществляет автоматическое
управление метаданными проекта?
21)
В каком случае возникает необходимость ручного управления
экспортом?
22)
Приведите синтаксис директивы ссылки на сторонние
компоненты (reference) в общем виде. Проиллюстрируйте его
фрагментом программы на языке C#.
Варианты заданий
Оснастить графическим интерфейсом на языке C# следующие функции на
языке SML.
33
Реализовать функцию на языке программирования SML, которая
выполняет синтаксический разбор следующего аппликативного выражения
по ассоциации влево с построением бинарного дерева:
1. a(bc)
2. ac(bc)
3. (ac)(bc)
4. (ab)(c(de))
5. a(b(cd)(ef))
6. a(b(cd)(ef)g)
7. a(b((cd)(ef))
8. (a(bc(de)f)gh)
9. abb(cdd(e)fg)
10. (ab(c(de))f(g(hi))j)
Реализовать функцию на языке программирования SML, которая
выполняет синтаксический разбор следующего аппликативного выражения
по ассоциации вправо с построением бинарного дерева:
11. a(bc)
12. ac(bc)
13. (ac)(bc)
14. (ab)(c(de))
15. a(b(cd)(ef))
16. a(b(cd)(ef)g)
17. a(b((cd)(ef))
18. (a(bc(de)f)gh)
28. abb(cdd(e)fg)
20. (ab(c(de))f(g(hi))j)
Порядок выполнения работы:
1) Реализовать программу на C# в соответствии с вариантом
исполнения.
2) Подготовить отчет в твердой копии и в электронном виде.
34
Список литературы и учебных материалов
Основная литература
1. Visual C#. NET Step by Step, Microsoft Press, 2003.
2. Вилле К. Представляем Си Шарп. ДМК Пресс, 2001. ISBN 5-94074-039-1
3. Зыков
С.В.
Лабораторный
практикум
по
курсу
«Языки
программирования». Ч.1. Основы объектного программирования на С++.
М.: МИФИ – 2001, 55 с. ISBN 5-7262-0454-9
4. Зыков
С.В.
Лабораторный
практикум
по
курсу
«Языки
программирования». Ч.2. Основы разработки приложений на С++ для
Win32 API. М.: МИФИ – 2001, 45 с. ISBN 5-7262-0454-9
5. Зыков С.В. Современные языки программирования. Ч.I. Функциональный
подход к программированию. М.:МИФИ – 2003, 230 с.
6. Петцольд Ч. Программирование для Microsoft Windows на C#. «Русская
редакция», 2002. ISBN 5-7502-0210-0
7. Платт Д.С. Знакомство с Microsoft .NET. «Русская редакция», 2001. ISBN
5-7502-0186-4
8. Рихтер Дж. Программирование на платформе Microsoft .NET Framework.
«Русская редакция», 2002.
9. Робинсон У. C# без лишних слов. ДМК Пресс, 2002. ISBN 5-94074-177-0
10. Шилдт Г. С#, учебный курс. Питер, 2003.
11. Gilmore S. Programming in Standard ML ’97: A Tutorial Introduction. The
University of Edinburgh, 2897.
12. Troelsen A. C# and the .NET platform (2nd ed.).- APress, 2003, 1200 p.p.
Дополнительная литература
13. The Standard ML Basis Library, http://www.standardml.org/Basis
/manpages.html
14. Harper R. Programming in Standard ML. Carnegie Mellon University, 2001.
15. Керниган Б., Пайк Р. Практика программирования.–СПб.: Невский
диалект, 2001.–381 с.
16. Браунси К. Основные концепции структур данных и реализация в С++.–
М.: Издательский дом «Вильямс», 2002.– 320 с.
17. Вольфенгаген В.Э. Конструкции языков программирования. Приемы
описания. М.: АО «ЮрИнфоР», 2001, 276 с.
35
Приложение 1. Особенности инсталляции интегрированной
среды разработки Visual Studio .NET
Требования к аппаратному обеспечению:
a. Процессор
Минимум:
Pentium II 450 MHz и выше
Рекомендовано:
Pentium III 600MHz и выше
b. Оперативная память
Минимум:
Windows 2000 Professional — 96 MB
Windows 2000 Server — 282 MB
Windows NT4.0 Workstation — 64 MB
Windows NT 4.0 Server — 160 MB
Windows XP Professional — 160 MB
Рекомендовано:
Windows 2000 Professional — 128 MB
Windows 2000 Server — 256 MB
Windows NT4.0 Workstation — 96 MB
Windows NT 4.0 Server — 282 MB
Windows XP Professional — 282 MB
c. Свободное место на жестком диске:
На системном разделе — 500 MB
На раздел, куда будет выполнена установка — 3 GB
d. Дисковод CD-ROM или DVD-ROM
e. Разрешение экрана
Минимум:
800 x 600, 256 цветов
Рекомендовано:
1024x768, 16 битный цвет
f. Манипулятор мышь или аналогичный ему
36
Требования к программному обеспечению:
1.
Операционная система Windows® 2000, Windows XP, или
Windows NT 4.03
2.
Права пользователя:
Для установки Visual Studio .NET необходимо иметь
административные привилегии на компьютер, на который
производится установка. Для последующей работы с Visual Studio
административные привилегии не требуются.
Дополнительные сведения о процессе установки можно найти в файлах
readme, находящихся в корне первого (а в случае с DVD версией единственного) диска установочного комплекта Visual Studio .NET.
Download