Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция01.docx
Скачиваний:
1
Добавлен:
23.12.2018
Размер:
147.25 Кб
Скачать

Методы объектов

   Методы — это процедуры и функции, которые принадлежат объекту. С помощью своих методов объект выполняет возложенные на него обязанности. Теперь нам предстоит узнать о методах объектов немного больше.    Как вы уже знаете, методы описываются внутри объявления объекта и бывают нескольких типов.

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

  • virtual (виртуальные) — такие методы могут быть переопределены в потомках объекта. Например, если у вас есть объект гараж и метод ворота, то в его потомке этот метод может быть заменен улучшенной версией. Для определения адреса Delphi строит таблицу виртуальных методов, которая позволяет во время выполнения программы определить адрес метода. В такой таблице хранятся все методы текущего объекта и его предка.

  • dynamic (динамические) — эти методы схожи с виртуальными, но для определения адреса используется другой способ. Для каждого объекта строится таблица только из его методов. Каждому методу назначается уникальный индекс. В данном случае экономится память, потому что не надо хранить адреса методов предков, но для поиска любого из них тратится намного больше времени.

  • message (сообщения) — такие методы реагируют на события операционной системы. Для большинства сообщений ОС Windows в Delphi уже есть специальные обработчики событий, но если вам нужно, чтобы метод реагировал на определенное событие, которого нет у компонента, необходимо определить его вручную.

  • abstract (абстрактный) — такой метод будет только объявлен в объекте, а реализации у него не будет. Если в объекте есть хотя бы один такой метод, то он считается абстрактным. Такой объект нельзя использовать.    Реализацию метода должны сделать потомки, и именно с потомками можно работать. Таким образом, вы можете в каком-либо объекте зарезервировать имя метода для потомков, чтобы они реализовали в нем какое-то действие.

   Если вы объявили метод как virtual или dynamic, то можно переопределить их действия в наследниках.

Type TDate=class

Math, Day, Year:integer;

Procedure SetValue(m,d,y:integer);

Function heapYear:Boolean;

End;

Procedure TDate.SetValue (m,d,y:integer);

Begin

Mont:=m; day:=d; Year:=y;

End;

*конструктор унаследован от TObject

Function TDate.heapYear:Boolean;

Begin

Result:=IsHeapYear(Year); {---------sysUtils.pas}

End;

Использование классов:

Var Aday: Tdate;

begin

Aday:=Tdate.Create;

ADay.SetValue(9, 10, 2011);

If Aday.heapYear then ShowMessage(‘висакосный год: ’+IntToStr(Aday.Year);

Aday.Free;

…………………

SELF

Методы очень похожие с процедурами или функциями.

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

Self.Month:=m;

Self.year:=y;

Метод отличается тем что у него есть адрес экземпляра объекта.

Создание компонентов динамически

Self часто используется когда необходимо явно обратиться к текущей форме в одном из её методов. При создании компонента на этапе выполнения программы необходимо передать параметр Owner(владелец) конструктору create компонента, а потом присвоить то же значение свойству Parent. Свойство Parent элемента управления содержит информацию о том какой другой элемент управления несет ответственность за отображение данного элемента на экране. Если элемент расположен на форме то форма становиться владельцем и родителем, если же поместить его внутри другого элемента(например на панель ) то форма будет владельцем а родителем – панель.

Пример – формы приложения нет дочерних компонентов, есть только обработчик события OnMouseDown.

Procedure TForm1.FormMouseDown ( );

Var Btn:TButton;

Begin

Btn:=Tbutton.Create(Self);

Btn.Parent:=Self;

Btn.left:=x; Btn.Top:=y;

Btn.Width:=Btn.Width+50;

Btn.Caption:=format(‘Button at %d, %d,’,[x,y]);

……………………..

……….при указании конкретного значения ….. кнопки будут появл только на форме с именем Форм1 даже если мы будем щелкать по другим формам.

Зад. Написать приложение почти такое же как этот пример только на форму поместить 1 кнопочку назвать ее, создать форму, при щелчке по этой кнопке должны создавать формы этого же класса Tform1 (их положение можно смещать относительно друг друга). При щелчке на любой из форм должны появляться динамически создаваемые кнопочки + указание их координат.

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

Правила.

1.Каждая версия метода должна сопровождаться директивой overload;

2.Разница между версиями должна быть в количестве и типе параметров. Или в том и другом.

3. Тип возвращаемого значения нельзя использовать в качестве отличительного признака версий.

Пример.

Type TDate=class

Fdate:TdateTime;

Public

Procedure SelValue(m,d,y:integer); overload;

Procedure SetValue(newDate:TDateTime); overload;

…………….

End;

Procedure TDate.SetValue(m,d,y:integer);

Begin

Fdate:=EncodeDate(y,m,d);

End;