Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
61-66.doc
Скачиваний:
2
Добавлен:
25.09.2019
Размер:
59.39 Кб
Скачать

61) Виртуальные и динамические методы.

1)Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения.

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

Пример виртуальной функции в Delphi:

Объявим два класса. Предка (Ancestor):

TAncestor = class

private

protected

public

{Виртуальная процедура.}

procedure VirtualProcedure; virtual;

procedure StaticProcedure;

end;

и его потомка (Descendant):

TDescendant = class(TAncestor)

private

protected

public

{Перекрытие виртуальной процедуры.}

procedure VirtualProcedure; override;

procedure StaticProcedure;

end;

2) Динамические методы вызываются медленнее виртуальных, но позволяют более экономно расходовать память. Каждому динамическому методу присваивается индекс – отрицательное число. В таблице динамических методов (Dynamic Method Table, DMT) класса хранятся индексы и адреса только тех динамических методов, которые описаны в данном классе. Если в DMT данного класса адрес нужного динамического метода не находится, то просматривается DMT класса-предка, и так далее по всей цепочке наследования до класса TObject. Таким образом, доступ к методу через DMT может привести к активному поиску в DMT разных классов и потребовать сотен тактов процессора.

Во всем остальном между виртуальными и динамическими методами нет принципиальной разницы.

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

Procedure <имя метода>[(<параметры>)}; Dynamic;

Function <имя метода>[(<параметры>)}: <тип результата>; Dynamic;

Редко перекрываемые методы рекомендуется делать динамическими.

62)Абстрактные методы.

Абстра́ктный ме́тод (или чисто виртуальный метод) — в объектно-ориентированном программировании, метод класса, реализация для которого отсутствует. Класс, содержащий абстрактные методы, также принято называть абстрактным (там же и пример). Абстрактные методы зачастую путают с виртуальными. Абстрактный метод подлежит определению в классах-наследниках, поэтому его можно отнести к виртуальным, но не каждый виртуальный метод является абстрактным.

Синтаксис объявления динамических методов:

Procedure <имя метода>[(<параметры>)}; Abstract;

Function <имя метода>[(<параметры>)}: <тип результата>;Abstract;

63) Преобразование типов.

Delphi поддерживает несколько различных типов данных. От типа зависят операции, которые программа будет выполнять над данными. Допустим тип Integer числовой. И если мы сложим две переменных между собой по ожидаемо получим их сумму.

var a, b, c : Integer; begin a := 5; b := 10; c := a+b; end;

переменная "c" у нас будет равнять числу 15. А вот если используется тип String то такая же операция уже даст не 15 а 510.

var a, b, c : String; begin a := 5; b := 10; c := a+b; end;

Программа просто соединит вместе два текстовых фрагмента.

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

  • StrToInt(значение) <=> IntToStr(значение) - преобразование между String и Integer

  • StrToFloat(значение) <=> FloatToStr(значение) - преобразование между String и Real

  • IntToFloat(значение) <=> FloatToInt(значение) – преобразование между Integer и Real

И не большей пример использование. Допустим на форме есть два компонента Edit и один Label. В поля Edit.Text вводятся числа, но они изначально представлены в текстовом виде и если нам нужно их перемножить, то сперва придется их преобразовать в числовой тип. А для вывода результата в поле Label.Caption обратно в текстовый. Для наглядности с переменными:

var a, b, c : Integer; begin a := StrToInt(Edit1.Text); b := StrToInt(Edit2.Text); c := a*b; Label1.Caption := IntToStr(c); end;

Или одной строкой:

begin Label1.Caption := IntToStr(StrToInt(Edit1.Text)*StrToInt(Edit2.Text)) end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]