Xreferat.com » Рефераты по информатике и программированию » Объектно-ориентированный подход к программированию

Объектно-ориентированный подход к программированию

внимательно, то можно понять, что у компилятора нет возможности определить метод какого именно класса нужно вызывать. Поэтому, для определения адреса метода используются специальные таблицы, где хранятся адреса на виртуальные и динамические методы: VMT - таблица виртуальных методов и DMT - таблица динамических методов. Когда компилятор встречает указатель на виртуальный метод, то он ищет его адрес в VMT, где хранятся все адреса виртуальных методов класса унаследованных и перекрытых, поэтому такая таблица занимает много памяти, хотя и способ вызова метода работает сравнительно быстро. Динамические методы вызываются медленнее, но занимают меньше памяти, т.к. в них хранятся адреса динамических методов только данного класса и их индексы. При вызове динамических методов проводится поиск по этой таблице, если метод не найден, то поиск продолжается в DMT предков вплоть до Tobject, где вызывается стандартный обработчик вызова динамических методов. Зачем же нам все это надо? При проектировании иерархии классов предметной области, нужно статическими делать методы, которые не меняют своего поведения в потомках, т.е. при более детальном рассмотрении явления. Динамические и виртуальные методы могут меняться при переходе от общего к частному. Вспомните класс Tfield, который является общим предком для всех классов-полей таблицы. Потомки этого класса реализуют доступ к столбикам таблицы разных типов от целого числа до BLOB массива, однако, Вы можете иметь удобный доступ к этим потомкам через указатель типа Tfield и работать с ними одинаково.

Перегрузка методов, процедур и функций

Перегрузка объявляется с помощью зарезервированного слова overload. Рассмотрим пример:

Type

TmyDateClass=class(TObject)

private

Adate: TdateTime;

Public

Procedure SetDate(Val: TDateTime); overload; // Объявляем возможность перегрузки

end;

TmySecondDateClass=class(TmyDateClass)

private

Adate: TdateTime;

Public

Procedure SetDate(Val: string); overload; // Объявляем возможность перегрузки

End;…

implementationProcedure TmyDateClass .SetDate(Val: TDateTime);

Begin

Adate:=Val;

End;

Procedure TmySecondDateClass.SetDate(Val: string);

Begin

Adate:=StrToDate(Val);

End;

Во время работы программы, вы можете использовать во втором классе оба метода SetDate. Если Вы передадите в качестве параметра строку, то будет вызван метод второго класса, а если TdateTime, то метод предка. Можно перегружать и виртуальные методы, только вместо override нужно использовать reintroduce, например:

Type

TmyDateClass=class(TObject)

private

Adate: TdateTime;

Public

Procedure SetDate(Val: TDateTime); overload; virtual; // Объявляем возможность перегрузки

end;

TmySecondDateClass=class(TmyDateClass)

private

Adate: TdateTime;

Public

Procedure SetDate(Val: string); reintroduce; overload; // Объявляем возможность перегрузки

End;Вы можете использовать перегрузку и для процедур и функций необязательно при наследовании, и даже процедур и функций не классового типа, например:

Function Myfunction(Val: string): string; overload;

Begin

Result:=Val+' Ok!'

End;

Function Myfunction(Val: Extended): extended; overload;

Begin

Result:=Val/2;

End;

Или

TmyDateClass=class(Tobject)

private

Adate: TdateTime;

Public

Procedure SetDate(Val: TDateTime); overload; // Объявляем возможность перегрузки

Procedure SetDate(Val: string); overload; // Объявляем возможность перегрузки

End;

Параметры по умолчанию

Если Вам нужно создать функцию, которая в качестве параметров почти всегда получает одно и то же значение, но все-таки иногда оно может меняться, то Вам нужно объявить параметры по умолчанию в качестве формальных параметров, например:

Procedure MyProcedure(Val1: Extended; Val2: Integer = 2);

Begin

End;

Тогда Вы сможете вызывать ее такими способами:

MyProcedure(42.33); // аналогично MyProcedure(42.33, 2);

MyProcedure(15.6, 8);

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

Делегирование

Событие - это свойства процедурного типа, предназначенные для создания пользовательской реакции на внешние воздействия. События в Delphi реализуется за счет создания поля процедурного типа и объявления соответствующего свойства класса, например:

Type

TmyEvent = procedure(Sender: Tcomponent); of object; // определение процедурного типа

TmyClass=class(Tcomponent)

Private

FmyEvent: TmyEvent;

Protected

Procedure DoMyEvent;

published

property OnMyEvent: TmyEvent read FmyEvent write FmyEvent;

end;

Допустим, Вы определили функцию function MyProcedure(Sender: Tcomponent) для обработки события с помощью инспектора объектов или написали вручную и налету присвоили объекту: MyClass.OnMyEvent:=MyProcedure. При наступлении определенных условий Ваш класс может вызвать процедуру DoMyEvent, где будет вызвана Ваша процедура MyProcedure так:

Procedure TmyClass .DoMyEvent;

Begin

If Assigned(FmyEvent) then FmyEvent(Self);

End;Мы видим, что был проверен указатель на пользовательскую процедуру обработки события, и если он действителен, то вызывается пользовательская процедура - это и есть делегирование. Обратите внимание, что я разместил свойство OnMyEvent в секции published для того, чтобы программист мог воспользоваться инспектором объектов для написания процедуры обработки события.

Список литературы

Банников. Н.А. Объектно-ориентированный подход к программированию.

Если Вам нужна помощь с академической работой (курсовая, контрольная, диплом, реферат и т.д.), обратитесь к нашим специалистам. Более 90000 специалистов готовы Вам помочь.
Бесплатные корректировки и доработки. Бесплатная оценка стоимости работы.

Поможем написать работу на аналогичную тему

Получить выполненную работу или консультацию специалиста по вашему учебному проекту
Нужна помощь в написании работы?
Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Пишем статьи РИНЦ, ВАК, Scopus. Помогаем в публикации. Правки вносим бесплатно.

Похожие рефераты: