ЗАДАНИЕ XXXIII

Тема: Наследование и иерархия классов. Включение базовых классов в схему производного.
Цель: Освоение методики построения иерархии классов путем включения базовых классов в схему производного.

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

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

Введение.

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

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

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

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

    Понятно, что при этом методе наследования не разрывается связь производного класса с базовым - объекты базового класса прямо входят в схему производного.

Задание 1.Иерархия классов на примере создания Калькуляторов .

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

1. Создайте новый проект. В схеме проекта создайте простейший абстрактный класс Calc1 - калькулятор, который может только вводить и хранить числа в памяти. На рисунке 1 показана его структура.

b2_1.gif (6774 bytes)
Рис1. Структура класса Calc1.

2. Создайте схему класса Calc1. Поместите на схему необходимые объекты: Reg, Operation, InputBox, NumberView, LGSpace.

Класс Reg предназначен только для хранения числа. Его текст элементарен

Float x

3. Реализуйте класс Operation для выполнения двух операций: запомнить введенное число и закончить работу.

Float x,a,flag
String st,cod
flag:=1
cod:=left(~st,1)
a:=float(SubStr(~st,1,10))
if(~cod==”=”)
x:=~a
endif
if(~cod==”q”)
CloseAll()
endif

4. Установите необходимые связи между объектами. Эти связи аналогичны связям в предыдущей работе. Схема класса Calc1 показана на рисунке 2.

b2_2.gif (16554 bytes)
Рис.2. Схема класса Calc1.

5. Запишите текст модели класса Calc1 :

Float x,a
String cod

Создайте две контактные площадки на схеме класса Calc1. Одну из них свяжите с объектом Operation для передачи переменных a и x, вторую - с объектом Reg для передачи переменной cod.

6. Запустите модель и проверьте ее работу. Установите подходящий порядок вычислений. После того, как модель отлажена, удалите со схемы проекта объект Calc1. Объект удаляется со схемы, но имидж остается в библиотеке проекта.

7. Создайте новый класс Calc2, который выполняет операции сложение и вычитание. Для этого поместите в проект новый класс Calc2 со следующем текстом:

Float x,a
String cod
if(~cod==”+”)
x:=~x+~a
endif
if(~cod==”-”)
x:=~x-~a
endif

8. Создайте схему класса Calc2 и поместите в нее объект Calc1, загрузив его из библиотеки проекта. Теперь Calc2 будет производным от Calc1 и наследует его модель, то-есть выполняет операции “==” и “q”. В дополнение к этому он выполняет операции “+” и “-“. Но для этого он должен иметь доступ к переменным своего базового класса Calc1. Для того, чтобы это было возможно, создайте в схеме Calc2 контактную площадку и передайте через нее переменные x, a и cod.

9. Запустите модель и проверьте ее работу. Удалите со схемы проекта объект Calc2. Объект удаляется со схемы, но имидж остается в библиотеке проекта.

10. Создайте новый класс Calc3, который выполняет операции сложение, вычитание, умножение и деление. Для этого поместите в проект новый класс Calc3 со следующем текстом:

Float x,a
String cod
if(~cod==”*”)
x:=~x*~a
endif
if(~cod==”/”)
x:=~x/~a
endif

11. Создайте схему класса Calc3 и поместите в нее объект Calc2, загрузив его из библиотеки проекта. Теперь Calc3 будет производным от Calc2 и наследует его модель, то-есть выполняет операции “==”, “q”,”+”,”-“. В дополнение к этому он выполняет операции “*” и “/“. Но для этого он должен иметь доступ к переменным своего базового класса Calc2. Для того, чтобы это было возможно, создайте в схеме Calc3 контактную площадку и передайте через нее переменные x, a и cod.

12. Запустите модель и проверьте ее работу.

Итак, вы создали иерархию классов

Reg
Calc3 Calc2 Calc1
Operation

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

pin2.gif (1000 bytes)Используя Calc3 в качестве базового класса, создайте класс Calc4, объекты которого представляют собой калькулятор, выполняющий наряду с четырьмя арифметическими действиями операции возведения в степень и извлечения квадратного корня.