• Название:

    Лекция 4. Объектно ориентированное программиров.. — презентация

  • Размер: 0.25 Мб
  • Формат: PPT
  • или


Кафедра «Автоматизированные станочные системы»Dept.
Of Automated Manufacturing Systems Объектно-ориентированное программирование -2 Конструкторы и деструкторы Начальные значения свойств объекта, как и у любых других переменных в Delphi, являются неопределенными TYPE TA=CLASS a:WORD; PROCEDURE Sum;END;…PROCEDURE TA.Sum;BEGIN a:=a+1 END;
При выделении памяти под объект нужно инициализировать его свойства Специальный метод – конструктор (constructor)вызывается перед первым использованием объекта Конструктор – обычная процедура, только вместо PROCEDURE пишется CONSTRUCTOR TYPE TA=CLASS a:WORD; CONSTRUCTOR Create; PROCEDURE Sum END; CONSTRUCTOR TA.Create; BEGIN a:=0 END;
Как использовать конструктор: VAR c:TA;BEGIN c:=TA.Create;…  В Delphi попытка работать с объектом, для которого не выполнялся метод Create, приводит к ошибке На каждый яд – свое противоядие… Деструктор (destructor) – специальный метод, вызываемый при завершении работы с объектом Главная задача деструктора – освобождение динамической памяти, выделенной в конструкторе САМОЕ СТРАШНОЕ ПРОГРАММИСТКОЕ ПРЕСТУПЛЕНИЕ – неосовобождение ранее занятой памяти Окончательный вариант описания объекта «Треугольник»: TYPE TTriangle=CLASS x1,y1:REAL; x2,y2:REAL; x3,y3:REAL; FUNCTION Check Triangle:BOOLEAN; PROCEDURE Sides(VAR a,b,c:REAL); PROCEDURE Angles(VAR a,b,c:REAL); FUNCTION Perimeter:REAL; FUNCTION Square:REAL; CONSTRUCTOR Create; PROCEDURE Draw(i:TImage); END; CONSTRUCTOR TTriangle.
Create;BEGIN INHERITED Create; …END;
ЧУТЬ ПОЗЖЕ… Как объекты хранятся в памяти? VAR a,b:TA;
Для каждого нового экземпляра объекта выделяется память под свойства.
Все методы хранятся в памяти только в одном экземпляре Доступ к свойствам из методов TYPE TA=CLASS a:WORD; PROCEDURE abc;…PROCEDURE TA.abc;VAR a:BYTE;BEGIN a:=10 END;
Чему присвоилось 10 – свойству или локальной переменной? Для устранения неопределенности используется ключевое слово SELF – указатель на текущий экземпляр объекта:
Мы не можем в методе написать:имя переменной-объекта.свойствопоскольку один и тот же метод используется разными переменными-объектами PROCEDURE TA.abc;VAR a:BYTE;BEGIN Self.a:=10 { присваивание свойству } a:=20 { присваивание локальной переменной }END;
Принцип инкапсуляции Значения свойств не должны меняться напрямую, а только через вызовы соответствующих методов TYPE TA=CLASS a:WORD;…. VAR c:TA;BEGIN c:=TA.Create; c.a:=10 TYPE TA=OBJECT a:WORD; PROCEDURE Set A(w:WORD);…. VAR c:TA;BEGIN c:=TA.Create; c.
Set A(10) Зачем нужна инкапсуляция? Изменение значения одного из свойств часто должно приводить к изменению значения другого свойства.
Возможна проверка корректности присваиваемых свойству значений.
TYPE TA=CLASS { электронагреватель } temperature:WORD; power:REALEND; …a.power:=10.0; «Спрятанные» свойства Для полного соблюдения принципа инкапсуляции имеется возможность создания свойств, которые нельзя будет менять напрямую TYPE TA=CLASS PRIVATE a:REAL; PUBLIC b:REAL END; Скрытые свойства Доступные свойства VAR obj:TA; BEGIN obj:=TA.Create; obj.a:=10; Field identifier expected Рекомендуется делать скрытыми все свойства объекта Скрытое свойство по-прежнему доступно внутри методов: PROCEDURE TA.Print; BEGIN a:=a/2;
Инкапсуляция требует – менять значения свойств объекта можно только вызовами методов a.
Set X(12) – правильно, но неудобноa.
X:=12 – удобно, но неправильно Для облегчения реализации принципа инкапсуляции и упрощения синтаксиса при работе с объектом введены понятия:
Поле объекта Свойство объекта (property) Поле – скрытое, вообще недоступно извне объекта: TYPE TA=CLASS PRIVATE a:WORD; b:BOOLEAN поля Свойство объекта – виртуальное поле, доступное извне: PUBLIC PROPERTY abc:word READ Get A WRITE Put A;
Свойство связано с полем при помощи специальных методов объекта:
- для записи значения в поле (WRITE);
- для чтения значения поля (READ).
TYPE TA=CLASS PRIVATE a:WORD; PROCEDURE Puta(newa:WORD); FUNCTION Geta:WORD; PUBLIC PROPERTY abc:WORD READ Geta WRITE Puta; END; IMPLEMENTATION PROCEDURE TA.Puta(newa:WORD); BEGIN a:=newa END; FUNCTION TA.Geta:WORD; BEGIN Result:=a END; Простейшая реализация методов чтения/записи:
Что будет происходить приобращении к свойству VAR obj:TA;…obj.abc:=10 VAR obj:TA;…c:=obj.abc+5; PROCEDURE TA.Puta(newa:WORD); BEGIN a:=newa END; FUNCTION TA.Geta:WORD; BEGIN Result:=a END; Cвойства только для чтения Их значения можно прочитать, но нельзя изменить извне объекта (только из методов) TYPE TA=CLASS PRIVATE a:WORD; FUNCTION Get A:WORD; PUBLIC PROPERTY abc:WORD READ Get A; …obj.abc:=10; TYPE Tvehicle=CLASS PRIVATE power:WORD; { мощность } speed: WORD; { скорость } gear: BYTE; { передача } engineon: BOOLEAN; { двигатель вкл/выкл } fuelcons: REAL; { расход топлива }PROCEDURE Start Engine;PROCEDURE Change Gear(n:BYTE);PROCEDURE Accelerator (n:REAL);… Описание объектного типа «автомобиль» Реализация методов: { переключение скоростей }PROCEDURE Tvehicle.
Change Gear(n:BYTE);BEGIN { 6 – задний ход } IF (n=6) AND (speed>0) THEN Message Dlg(‘Вы совсем с ума посходили!’, mt Error, [mb OK],0)ELSE BEGIN Clutch(TRUE); { выжали сцепление } Gear:=n; Clutch(FALSE); { отпустили сцепление }END;
Пример.
Объект - автомобиль Свойства:
- мощность двигателя;
- расход топлива на 100км;
- текущая скорость;
- текущая передача;
- двигатель вкл/выкл…Методы:
- запустить двигатель;
- установить передачу номер…;
- изменить подачу топлива в двигатель… Как быть, если мы пересели с легковой машины на самосвал? Появятся новые свойства:
- грузоподъемность;
- кузов поднят/опущен;
- упоры подняты/опущены… Создавать весь объект заново?Есть способ лучше!