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

Указатели на методы

- это специальный элемент языка Object Pascal, на котором основана реализация событий Дельфи.

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

В отличии от указателя на функцию, указатель на метод хранит в себе два адреса:

a) адрес кода метода

б)адрес экземпляра объекта

Когда указатель на метод используется для обращения к методу, адрес экземпляра объекта появляется в коде метода под именем self.

В Object Pascal есть универсальный тип

TMethod = record

Code. Data:Pointer;

End;

Этот тип может быть использован в приведении типов для доступа к коду и данным указателей на метод

While <>nil, while name<>TObject.циклы прикрутить к лабе.

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

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

След.2 выражения эквиваленты

If sender.InheritsFrom(TButton) then

If sender is TButton then….

Различие в том в отличии от операции is метод InheristsFrom можно применять как в отношении класса, так и объектов, ссылок на классы. InheristsFrom более гибкий..

Объявление типа указатель на метод такое как и процедурного типа, но в конце добавляются ключевые слова of object.

Type IntProceduralType = procedure (Num:integer);

IntMethodType = procedure (Num:integer) of object;

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

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

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

Пример:

*вернемся к классу Tdate. Добавим туда событие, при изменении значения даты будем извещать пользователя компонента об этом. Событие будет называться OnChange. Для определения события определим соответствующее свойство и добавим некоторые данные для хранения указателя на метод, которому соответствует событие. В класс добавляется следующее новое определение.

Type TDate = class

Private

FOnChange:TNotifyEvent; // tro lo lo

Protected

Procedure DoChange; dynamic;

Public

………………………

Property OnChange: TNotifyEvent read FOnChange write FOnChange;

End;

*** TNotifyEvent = procedure (Sender:Tobject) of object;

Пользователь этого класса может присвоить новое значение свойству и следовательно private полю FOnchange. Класс TDate при изменении данных просто вызывает метод, сохраненный в поле FOnChange. Очевидно, что этот вызов может осуществиться только если событийному свойству присвоено какое - то значение.

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

Procedure TDate.DoChange,

Begin

If Assigned (FOnChange)

Then FOnChange(Self);

End;

Обычно методы диспетчиризации называются также как и события только без префикса On. Но есть исключения OnEnter, doExit.

Метод DoChange в свою очередь вызывается каждый раз, когда изменяется одно из значений, например:

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

Begin

fDate:=Encode(y,m,d);

DoChange;

End;

*Приложение должно содержать следующее –

1) Добавим в класс формы новый пользовательский метод.

1

TdateForm = class(TForm)

Procedure DateChange(Sender:TObject);

End;

// будет обновлять метку, в которой текущая дата.

Procedure TdateForm.DateChange;

Begin

lbDate:=TheDay.GetText; //выведет измененную метку

End;

Затем, например, в методе FormCreate этот обработчик свяжем с обрабатываемым событием.

Procedure TDateForm.FormCreate(…);

Begin

. . . // инициализируем и т.п.

TheDate.OnChange:=DateChange; //обработчик присвоили методу формы

End;

Теперь в приложении при любом изменении даты метод будет обновляться автоматически. Код приложения упростится.

______________

ООП технология появилась в 1960 годы, промышленное развитие получила в 1980 годы, преимущество ООП на протяжении всего этого времени подвергается критическому анализу.

Приложение можно построить быстрее, так как объекты можно повторно использовать.

Существует большая разница, между ПО на ООП языке и реально многократно используемом каркасе классов объектов (трудно такой каркас разработать).

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

При необходимости разработать подобные системы (большие) необходимо добиться возможности адаптировать их к частым изменениям. В таких случаях ООП языки, инструменты и средства предоставляют возможность представить такие системы как гибкую композицию программных компонент. Это может потребовать больших затрат, но только ООП технология может упростить задачу.

OO Software Composition

ООП построение программных систем – это применение ООП технологии для построения гибких программных приложений и программных компонент.

На протяжении истории развития программных систем существовала тенденция их развития от закрытых изолированных к открытым.

Открытые системы должны быть открыты по 3 основным направлениям :

1) топология: открытые приложения работают в конфигурируемой сети

2) платформа: техническая и программные платформы должны гетерогенные (разнородные)

3)эволюция: требование к системе нестабильно и постоянно меняется.

ООП подход частично удовлетворяет этим требованиям, т.к. скрывает представление данных и реализацию деталей за ООП интерфейсом, защищая клиента, пользователя от изменений в реализации до ???.

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

Что такое компоненты и чем они отличаются от объектов ?

Необходимо различать методологические и технические аспекты.

о Определение компонента более общее, чем объекта.

о Объект инкапсулирует данные и связанное с ними поведение, а компоненты могут инкапсулировать некоторые полезные программные абстракции.

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

На уровне программной технологии компоненты – это старая идея (60 годы, идея структурного программирования и модульности), но она получила новое развитие через композиционные механизмы ООП языков программирования.

Дельфи поддерживает компонентно – ориентирование видение программного обеспечения. После изменения приложения пользовательские компоненты создаются в той же самой среде с применением тех же самых инструментальных средств , которые используются для создания приложений. Определение компонента Дельфи тоже зависит от точки зрения. Для разработчиков приложений (у них функциональная точка зрения) компонент – это просто элемент управления, выбранный из некоторого набора и помещенный на форму. С точки зрения разработчика компонентов, чисто техническое определение – состоит в том, что компонент Дельфи – это любой объект, порожденный от класса TComponent внутри иерархии классов библиотеки визуальных компонентов.

Еще одно определение : компонент – это любой фрагмент ПО, с которым во время проектирования работают как с черным ящиком (большинство компонентов, это визуальные элементы управления, используемые в пользовательском интерфейсе, но сущ.и не визуальные, например таймер).

САМОСТОЯТЕЛЬНО – ПРОЦЕСС СОЗДАНИЯ КОМПОНЕНТОВ. ОТВЕТИТЬ – ЗАЧЕМ НУЖНО СТРОИТЬ ПОЛЬЗОВАТЕЛЬСКИЕ КОМПОНЕНТЫ, КОГДА ЭТО ПОВЫШАЕТ ЭФФЕКТИВНОСТЬ???

Придумать, найти, взять компонент.