ЗАДАНИЕ XXXII

Тема: Основные понятия объектно-ориентированной методологии. Классы. Иерархия классов. Наследование.
Цель: Краткое знакомство с основными понятиями объектно-ориентированной методологии. Построение простейших классов.

Для работы необходимо:

pin2.gif (1000 bytes) владение клавиатурой и мышкой;
pin2.gif (1000 bytes) владение основными приемами работы в MS Windows;
pin2.gif (1000 bytes) владение основными приемами работы в Stratum 2000.

 

Основные понятия

Класс - множество объектов, связанных общностью структуры и поведения. Имидж, хранящийся в библиотеке - это класс. Модель имиджа - это определение класса, которое включает текст имиджа, его переменные и схему.

Имидж может храниться как в стандартной библиотеке, так и в проекте. Классы (имиджи), хранящиеся в стандартных библиотеках, изменять нельзя, их можно только наследовать. Классы, созданные в проекте, доступны и для изменения в рамках этого проекта.

Определение класса - это построение структуры объекта данного класса (схемы), установка связей между элементами (объектами) схемы и запись текстов математических моделей имиджей. В тексте модели отражаются методы класса.

Метод - операция над объектом, определенная как часть описания класса. Методы определяют поведение объекта.

Объект - конкретное представление класса, обладающее характеристиками состояния, поведения и индивидуальности. Соответствует понятию “экземпляр класса”. Структура и поведение сходных объектов определены в общем для них классе. Объекты одного класса имеют одинаковую модель, но могут отличаться значениями переменных. Все, что может делать объект, заключено в его модели. Для того, чтобы заставить объект выполнить какие-либо действия, надо обработать его модель. Обработка модели выполняется автоматически средой, если объект не “заморожен” (_enable<>0). Менять поведение объекта можно за счет значений переменных по “связям” (флагам). Изменение поведения объекта равнозначно вызову того или иного метода его класса.

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

Классы могут образовывать иерархию на основе наследования.

Иерархия - это подчинение или упорядочение абстракций. Две типичные иерархии в сложной системе - структура классов (иерархия “общее/частное”) и структура объектов (иерархия “целое/часть”).

Наследование - это отношение между классами, при котором класс использует структуру или поведение другого (одиночное наследование) или других (множественное наследование) классов. Наследование вводит иерархию “общее/частное”, в которой класс наследует от одного или нескольких более общих надклассов. Подклассы обычно дополняют или переопределяют структуру и поведение своих надклассов. Механизм наследования позволяет объекту использовать описание не только класса, экземпляром которого он является, но также и всех остальных классов, расположенных сверху по цепочке иерархии. Класс, который наследует, называется производным классом; класс, от которого наследуют, называется базовым.

Для создания производного класса необходимо скопировать имидж базового класса в проект, присвоить копии имя производного класса и внести необходимые изменения в его модель.

Задание 1. Создание класса.
Создать простой класс Calculator (Калькулятор с памятью), выполняющий операции сложение и вычитание .

Порядок выполнения работы.

  1. Создайте новый проект, поместите на схему проекта новый имидж и задайте имя его класса - Calculator.
  2. Создайте схему имиджа и поместите на схему четыре новых имиджа: класс “сложение” (имя класса - Add), класс “вычитание” (имя класса - Sub), класс “регистр” (имя класса - Reg), класс “устройство управления” (имя класса - Control). Регистр - это память на одно число.
  3. Запишите следующие тексты моделей созданных классов:

Модель класса Add.

Float x,a,_enable
x:=~x+~a
_enable:=0

Модель класса Sub.

Float x,a,_enable
x:=~x-~a
_enable:=0

Модель класса Control.

String st,cod
Float a,flag,flag_add,flag_sub
flag:=1;flag_add:=0;flag_sub:=0
cod:=left(~st,1); a:=float(SubStr(~st,1,10)
swith
case(~cod==”+”)
flag_add:=1;break
case(~cod==”-”)
flag_sub:=1;break
case(~cod==”q”)
CloseAll()
endswith

Модель класса Reg.

Float sum

  1. Установите связи между объектом Reg и объектами Add и Sub по переменным sum и x.
    Установите связи между объектом Control и объектами Add и Sub по переменным a, а также флагами flag_add, flag_sub и переменной _enable объекта Control.
  1. Для ввода команд поместите на схему объект InputBox и установите связи между ним и объектом Control, соединив переменные _enable и InpuString объекта InputBox с переменными flag и st объекта Control.
  2. Для индикации результата (содержимого регистра) установите на схему объект NumberView, связав его с объектом Reg по переменным value и sum. Поместите объект NumberView в графическое пространство GraphSpace.
  3. У Вас должна получиться схема, приведенная на рисунке 1. Установите показанный на рисунке порядок обработки объектов (порядок вычислений).

  4. Выполните вычисления, вводя различные команды и просматривая результаты. Команда вводится в формате КОП ЧИСЛО, где КОП - код операции (+, - или q), ЧИСЛО- любое вещественное число.
  5. Проанализируйте реализацию класса Calculator. Обратите внимание на то, как инициируются операции сложения и вычитания. В исходном состоянии объекты Add и Sub неактивны (_enable=0). Если поступила команда сложения или вычитания, значения переменных flag_add или flag_sub, соответственно, устанавливаются в 1. Это значение по связям передается переменной _enable объекта Add или Sub, соответственно, и на следующем шаге выполняется соответствующая операция. После выполнения операции _enable снова устанавливается в 0. Операнды операций поступают в объекты Add и Sub по связям от объектов Control и Reg.
    Обратите внимание на то, как происходит обмен сообщениями между объектами - исключительно по связям.
  6. Нарисуйте иерархию объектов. Как видите, класс Calculator наследует свойства классов Add и Sub путем включения их в свою схему.

  7. Измените порядок обработки объектов. Посмотрите, как в этом случае работает Калькулятор. Объясните происшедшие изменения.

Задание 2.Создание производного класса.
Необходимо создать Калькулятор, который выполняет четыре арифметических действия: сложение, вычитание, умножение и деление. У вас уже есть класс
Calculator, выполняющий операции сложение и вычитание. Вы можете использовать его в качестве базового для создания нового класса Calculator1. Что для этого надо сделать?

Во-первых, создать два новых класса Mult (умножение) и Del (деление) и добавить объекты этих классов в схему Calculator1.

Во-вторых, создать новый класс Control1 и заменить объектом этого класса объект Control в схеме Калькулятора. Класс Control1 создадим как производный от Control, добавив обработку операций умножение и деление.

Порядок выполнения работы.

  1. Создайте новый проект. Установите в качестве добавочной библиотеки проекта библиотеку предыдущего проекта (содержащую классы Add, Sub, Reg).
  2. Скопируйте в проект класс Calculator. Копии будет автоматически присвоено имя Calculator_copy_1. Измените это имя на Calculator1. Если Вы забыли, как копировать имидж, посмотрите Дополнительные сведения.

  3. Создайте классы Mult и Del. Их модели аналогичны моделям классов Add, Sub. Включите объекты Mult и Del в схему Calculator1. Установите связи объектов Mult и Del с объектом Reg по переменным x и sum.
  4. Удалите из схемы объект Control.
  5. Скопируйте в схему класс Control. Измените имя копии на Control1. Внесите изменения в текст модели, добавив:
              Float flag_mult,flag_del
              case(~cod==”*”)
              flag_mult:=1;break
              case(~cod==”/”)
              flag_del:=1;break
  6. Установите связи между объектом Control1 и объектами InputBox, Add, Sub, Mult и Del.
  7. Установите порядок обработки объектов. Проверьте работу Калькулятора.

Дополнительные задания.

pin2.gif (1000 bytes)Добавьте в Калькулятор дополнительные операции, например, возведение в степень, извлечение корня, вычисление тригонометрических функций.

pin2.gif (1000 bytes)Создайте два класса: NewControl и Shema. Объект NewControl принимает команду, расшифровывает ее и в зависимости от типа операции формирует значение переменной flag(1,2,3,...), которое по связям передается объекту Shema. Объект Shema в зависимости от значения переменной flag выполняет соответствующую операцию.

pin2.gif (1000 bytes)Создайте новый Калькулятор как потомок от Calculator1, изменив его модель.

 

Дополнительные сведения.

Для того, чтобы создать производный класс путем копирования базового класса, надо выполнить следующие операции.

  1. На панели инструментов “Стандартные” выбрать пиктограмму “Стандартная”. Открывается окно “Иерархия библиотек”.

  2. Выбрать библиотеку с базовым классом. Выполнить в ней копирование базового класса, для чего в контекстном меню выполнить команду “Копировать” (или Ctrl+Insert).

  3. Выбрать библиотеку своего проекта. Выполнить команду “Вставить” (Shift+Insert). В библиотеку проекта добавится производный класс. Его имя формируется автоматически из имени базового класса + “_copy_N”, где N - порядковый номер.

  4. Перейти в свой проект. Вставить объект производного класса в схему, загрузив его из библиотеки проекта.

  5. Изменить имя производного класса на более подходящее. Внести необходимые изменения в его схему и текст.