- •Министерство образования российской федерации Воронежский государственный технический университет а.Г. Остапенко г.А. Кащенко и.В.Давыдов Морев д.Е.
- •Воронеж 2001
- •Рецензенты: Остапенко г.А.
- •Введение
- •Методы разработки программного обеспечения
- •Подходы к разработке программного обеспечения
- •Планирование разработки программного обеспечения
- •Основные типы языков программирования.
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентрованное программирование
- •Процедуры.
- •Модули.
- •Абстрактные типы данных.
- •Построение программного обеспечения по объектно-ориентированной методике
- •2.1. Функционирование объектно-ориентированного программного обеспечения
- •2.2. Классы. Отношения между классами
- •Этапы построения программного обеспечения
- •2.4. Объектно-ориентированный анализ
- •Информационные модели
- •Жизненные циклы
- •Модели процессов
- •2.5. Нотация для объектно-ориентированного проектирования
- •2.6. Объектно-ориентированное проектирование – ood
- •2.7. Заключительное замечание
- •Основные недостатки:
- •3. Средства объектно-ориентированного программирования
- •Средства объектно-ориентированного рограммирования Turbo-Pascal
- •Понятие “объект”
- •Статические и виртуальные методы. Полиморфизм Статические методы
- •Виртуальные методы. Полиморфизм
- •Конструкторы и деструкторы
- •3.1.5. Сравнимость данных типа объект
- •3.1.6. Динамический вызов объектов
- •3.2. Средства объектно-ориентированного
- •Понятие “класс”
- •Компоненты классов. Доступ к ним.
- •Дружественные функции
- •Конструкторы и деструкторы
- •Статические члены классов
- •3.2.6. Перегрузка операций
- •3.2.7. Виртуальные функции
- •3.2.8. Динамическое создание объектов
- •3.2.9. Проверьте свои знания!
- •Литература:
- •Оглавление
- •Воронежский государственный технический университет,
- •394026 Воронеж, Московский просп. 14
3.1.5. Сравнимость данных типа объект
В Turbo Pascal допускается присвоение переменных типа объект друг другу. При этом должны соблюдаться следующие требования.
Если две переменные соответствуют одному типу объекта, то присвоения допускаются в обоих направлениях. При этом присвоении передаётся значения всех переменных.
Если объект С – предшественник и D – наследник и C1 и D1 – переменные типа объект C и объект D, то допускается присвоение C1:=D1. Обратное присвоение недопустимо, потому что объект – наследник содержит больше полей данных, чем объект – предшественник, такое присвоение влечет за собой неопределённость части полей данных.
3.1.6. Динамический вызов объектов
Аналогично другим переменным, переменные типа объект могут динамически создаваться и уничтожаться. Для обеспечения динамического вызова в программе должен быть указатель на объект, а сам объект должен содержать конструктор (даже тогда, когда он не содержит виртуальных методов) и деструктор. Конструктор необходим для формирования VMT, в котором задана длина объекта. Через VMT при динамическом создании экземпляра объекта можно узнать его длину для определения необходимого объёма памяти. Деструктор тоже обеспечивает доступ к VMT для определения объёма освобождаемой памяти. Деструктор может не иметь в своем составе операторов; тогда он обеспечивает только связь с VMT. В общем случае в деструктор желательно включить действия, необходимые перед уничтожением экземпляра объекта. Деструктор может быть виртуальным, конструктор – нет. Для создания экземпляра объекта используется оператор New:
New(S1,Init); где
S1 – указатель на объект,
Init – конструктор объекта.
Приведенная ниже запись эквивалентна предыдущей:
New(S1); S1^.Init;
Для уничтожения экземпляра объекта используется оператор Dispose:
Dispose(S1,Done); где
S1 – указатель,
Done – деструктор.
или S1^.Done; Dispose(S1);
Проиллюстрируем сказанное на примере. Описание объектов Location и Ch приведено в п. 3.3.2.
{Объект Location и Ch см. выше, вариант Virt}
type
BufferType=Array[1..1000] of Byte;
St = Object(Ch)
S:String;
F:Text;
FileOpen:Boolean;
Buffer:^BufferType;
Constructor Init;
Destructor Done;Virtual;
Procedure Show;Virual;
Procedure SetS(NewS:String);
Procedure OpenFile(Fname:String):
End;
Constructor ST.Init;
Begin
Ch.Init; S:=’’;
FileOpen:=False;
New(Buffer); {Выделение памяти для переменных}
{экземпляра объекта}
End;
Destructor St.Done;
Begin
Dispose(Buffer); {Освобождение памяти, занятой при выполнении}
{конструктора}
if FileOpen Then Close(F);
end;
Procedure St.Show;
Begin
Write(S);
End;
Procedure St.SetS(NewS:String);
Begin
S:=NewS; Writeln(F,NewS);
End;
Procedure St.OpenFile(Fname:String);
Begin
Assign(F,Fname);
Rewrite(F);
FileOpen:=True;
End;
Var S1,S2:^St; {указатели на St}
Begin
ClrScr;
New(S1.Init); {Cоздание экземпляров объектов}
New(S2.Init); {Запускается два раза конструктор}
With S1^ Do {Выполнение операций над экземпляром объекта}
Begin {на который указывает S1}
OpenFile(‘ST1.LOG’);
SetS(‘THIS IS STRING 1’);
MoveTo(10,10);
End;
With S2^ Do
Begin
OpenFile(‘ST2.LOG’);
SetS(‘THIS IS STRING 2’);
MoveTo(10,11);
End;
Dispose(S1,Done); {Уничтожение объектов, запуск деструктора} Dispose(S2,Done);
End.
В результате выполнения этой программы будут созданы два текстовых файла ST1.LOG и ST2.LOG и на экране появятся 2 строки текста.