Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Введение в теорию программирования. Объектно-ориентированный подход. Учебное пособие
.pdf
его площади area и перемещение начала отсчета в точку с
координатами (3,3).
В результате анализа рассмотренных примеров становится очевидным,
что объект является принципиально динамическим и изменяет
состояние в зависимости от соотнесения (времени и внешних
воздействий).
В этой связи исследуем более подробно простейший, статический
случай полей объекта, который в языке программирования C# выделен
в самостоятельный синтаксический элемент, характеризующийся
независимостью от состояния объекта (и потому условно
принадлежащий к классу ). Приведем модифицированный пример
предыдущего класса для случая статических полей:
class Rectangle {
static Color defaultColor;
// для каждого класса
static readonly int scale;
// для каждого класса
int x, y, width,height;
// для каждого объекта
...
}
Заметим, что статические поля defaultColor и scale остаются
неизменными внутри класса, тогда как динамические поля x, y, width
и height индивидуально изменяются в зависимости от состояния
каждого из объектов класса. Доступ изнутри класса осуществляется
посредством обращения:
... defaultColor ... scale ...
а из внешних классов - посредством обращения:
... Rectangle.defaultColor
... Rectangle.scale ...
с указанием полных имен объектов. Поскольку статические поля
являются неизменными со временем, они реализуются выделением
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
71

памяти из статической области.
Познакомившись с особенностями реализации полей как элементов
классов с учетом динамики и статики их реализации, перейдем к
рассмотрению способов манипулирования объектами классов, которые
в объектно-ориентированном программировании принято называть
методами, и которые, по сути, являются функциями. Как и поля, методы
описываются в блоке описания класса.
Рассмотрим особенности использования методов на примере
следующей программы на языке C#, представляющей описание класса C
с полями sum и n и методами Add и Mean:
class C {
int sum = 0, n = 0;
public void Add (int x){
sum = sum + x; n++;
//процедура
}
public float Mean(){
return(float)sum/n;
//функция(должна возвратить
//значение)
}
}
Прежде всего, отметим, что методы в языке программирования C#
делятся на функции (которые обязаны возвращать значение) и
процедуры (которые могут и не возвращать значения, на что указывает
тип void ). В данном примере Add - процедура, а Mean - функция, в
которой возврат значения явно указывается оператором return.
Доступ к методу, как и к полю, можно получить изнутри класса:
this.Add(3);
float x = Mean();
а также из других классов, с явным указанием полного имени:
C c = new C();
c.Add(3);
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
72

float x = c.Mean();
Заметим, что оператор this представляет собой указатель на текущий
объект.
Продолжая аналогию между полями и методами как элементами
классов, мы приходим к понятию статического метода. Рассмотрим
особенности реализации статических методов в языке
программирования C# на следующем примере:
class Rectangle {
static Color defaultColor;
public static void ResetColor() {
defaultColor = Color.white;
}
}
Как явствует из приведенного примера, под статическим методом
понимается операция, определенная над статическими элементами
классов (т.е. над статическими полями ).
В данном примере описания класса Rectangle статическим является
метод ResetColor (заметим, что он не возвращает значения, т.е.
ResetColor - это статическая процедура).
По аналогии с предыдущими случаями, для доступа к статическому
методу изнутри класса достаточно указать только краткое имя данного
метода:
ResetColor();
В случае доступа из сторонних классов необходимо указать полное имя
статического метода:
Rectangle.ResetColor();
Исследовав особенности описания и управления поведением основных
элементов классов, объектов и методов для динамического и
статического случаев, кратко остановимся на особенностях
наследования свойств ( полей и методов ) классов объектов языка
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
73

программирования C#. Для иллюстрации приведем следующий пример
фрагмента программы на языке C#:
class Stack {
int[] values;
int top = 0;
public Stack(int size){
...
}
public void Push(int x){
...
}
public int Pop(){
...
}
}
В данной программе приведено (с сокращениями) описание класса,
моделирующего стек (аналогичный стеку КАМ) посредством массива
элементов values с вершиной top, функциями создания стека Stack
размером size и "выталкивания" Push элемента x из стека, а также
"вталкивания" Pop элемента в стек.
Аналогично объектам ссылочных типов, объекты классов (как
принципиально динамические) хранятся в динамической области
памяти (или так называемой "куче"). В силу ограничений безопасности
программного кода любой объект языка программирования C# до
использования необходимо инициализировать оператором new,
например:
Stack s = new Stack(100);
Заметим, что наследование классами свойств других классов может
быть как единичным, так и множественным. Последнее реализуется
посредством множественных интерфейсов (что приводит к
множественному наследованию типов).
Подводя итоги обсуждения основных понятий объектноориентированного подхода к программированию ( классов, объектов и
методов ) применительно к языку программирования C#, кратко
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
74

отметим достоинства и недостатки подхода.
К преимуществам объектно-ориентированного подхода следует отнести:
интуитивную близость произвольной предметной области;
возможность моделирования сколь угодно сложной предметной
области, высокий уровень абстракции (рассмотренные примеры
дают представление о "масштабируемости" моделирования
сложных объектов);
событийно-ориентированный подход (динамика объектов и
возможность манипулирования ими посредством методов
приводят к управлению объектами посредством событий );
возможность повторного использования описаний (основана на
обращении к полям и методам извне описания классов, а также на
использовании механизма наследования );
параметризация методов обработки объектов (основана на
использовании механизма интерфейсов, которые будут подробно
рассмотрены в ходе дальнейших лекций).
К недостаткам объектно-ориентированного подхода к
программированию можно отнести сложность тестирования и
верификации программ. Заметим, однако, что выбор ламбдаисчисления и комбинаторной логики в качестве средства формализации
объектов, классов и методов позволяет построить адекватную, полную
и непротиворечивую объектную модель, учитывающую как
статический, так и динамический случаи.
Для более подробного самостоятельного ознакомления с тематикой
лекции рекомендуется следующий список источников: [ 24, 28, 36, 66-
69, 79-81].
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
75

Объекты и классы
Цель: ознакомление с основой объектного подхода в языке C#,
созданием объектов, классов и механизмом наследования.
Теоретические сведения
Классы и обьекты
Понятие класса является фундаментальным в ООП и служит основой
для создания объектов. В описании класса определяются данные (т.е.
переменные) и код (т.е. методы), манипулирующий этими данными.
Объекты являются экземплярами класса.
Методы и переменные, составляющие класс, называются членами
класса. При определении класса объявляются данные, которые он
содержит, и код, манипулирующий этими данными. Данные содержатся
в переменных экземпляра, которые определены классом, а код
содержится в методах. В языке С# определены несколько специфических
разновидностей членов класса. К ним относятся: переменные
экземпляра, статические переменные, константы, методы,
конструкторы, деструкторы, индексаторы, события, операторы и
свойства.
Инициализация переменных в объекте (как в экземпляре класса)
производится непосредственно в конструкторе класса. В составе класса
может быть определено несколько конструкторов.
Синтаксис определения класса:
class имя_класса{
тип_доступа тип имя_переменной1;
тип_доступа тип имя_переменной2;
...
тип_доступа возвращаемый_тип
имя_метода1(список_параметров)
{тело_метода}
}
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
76

где тип_доступа может принимать одно из следующих значений:
public, private, protected, internal. Члены класса с типом
доступа public являются общедоступными (т.е. доступны из любой
точки программы за пределами данного класса), с типом доступа
protected – внутри членов данного класса и его производных, с
типом доступа private – только для других членов данного класса.
Тип доступа internal применяется для типов, доступных в пределах
одной сборки.
Приведем пример описания класса:
class Animal{
public string Name;
private int Weight;
protected int Type;
public int Animal(int W, int T, string N){
Weight=W;
Type=T;
Name=N;
}
public int GetWeight(){return Weight;}
}
Создание обьекта
Синтаксис:
имя_класса имя_обьекта = new имя_класса();
При создании обьекта (т.е. экземпляра класса) происходит вызов
соответствующего конструктора класса.
Понятия конструктора и деструктора
Под конструктором класса будем понимать метод для инициализации
объекта при его создании. Конструктор имеет то же имя, что и его
класс. В конструкторах тип возвращаемого значения не указывается
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
77

явно. Конструкторы используются для присваивания начальных
значений переменным экземпляра, определенным классом, и для
выполнения любых других процедур инициализации, необходимых для
создания объекта.
Конструктор существует для любого класса, независимо от того,
определен он в явном виде или нет. Умолчаниями языка С#
предусмотрено наличие конструктора, который присваивает нулевые
значения всем переменным экземпляра (для переменных типовзначений) и значения null (для переменных ссылочного типа). В
случае явного определения конструктора класса конструктор по
умолчанию не используется.
Синтаксис описания конструктора:
имя_класса(список_параметров)
{тело_конструктора}
Под деструктором будем понимать метод, который автоматически
вызывается при уничтожении объекта класса (непосредственно перед
началом процедуры "сборки мусора"). Деструкторы не имеют
параметров и не возвращают значений.
Синтаксис описания деструктора:
~имя_класса() {тело_деструктора}
Наследование
Под наследованием будем иметь в виду свойство, с помощью которого
один объект может приобретать свойства другого. При этом
поддерживается концепция иерархической классификации, имеющей
направление сверху вниз. При принятии концепции наследования, для
вновь создаваемых объектов необходимо определять только те свойства,
которые делают его уникальным в пределах своего класса. Объект
может наследовать общие атрибуты от родительских по отношению к
нему классов.
Синтаксис описания объекта:
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
78

class имя_класса : имя_родительского_класса
{
тело_класса
}
Пример описания объекта:
class Predator:Animal{
private int Speed;
}
Наследование формирует иерархию классов на основе отношения
частичного порядка ISA ("являться").
Иерархия может быть построена и для объектов. В этом случае она
имеет структуру, которая строится на основе отношения структурного
вхождения ("часть-целое"), при котором один объект является частью
другого.
Порядок выполнения работы
1. Разработать методы и свойства для каждого из определяемых
классов.
2. Реализовать программу на C# в соответствии с вариантом
исполнения.
Варианты заданий
Построить иерархию классов в соответствии с вариантом задания:
1. Студент, преподаватель, персона, заведующий кафедрой
2. Служащий, персона, рабочий, инженер
3. Рабочий, кадры, инженер, администрация
4. Деталь, механизм, изделие, узел
5. Организация, страховая компания, нефтегазовая компания, завод
6. Журнал, книга, печатное издание, учебник
7. Тест, экзамен, выпускной экзамен, испытание
8. Место, область, город, мегаполис
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
79

9. Игрушка, продукт, товар, молочный продукт
10. Квитанция, накладная, документ, счет
11. Автомобиль, поезд, транспортное средство, экспресс
12. Двигатель, двигатель внутреннего сгорания, дизель, реактивный
двигатель
13. Республика, монархия, королевство, государство
14. Млекопитающее, парнокопытное, птица, животное
15. Корабль, пароход, парусник, корвет
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
