Delphi-Help

Dynamic

Печать
Рейтинг пользователей: / 0
ХудшийЛучший 

Dynamic

Описание

Function|Procedure declaration; Dynamic;

Директива Dynamic позволяет методу класса быть отменой (замененной) так же названным методом в производном классе.
Вы можете пометить функцию или процедуру как Dynamic , когда вы хотите позволить программисту, который создает класс, основанный на вашем классе, заменить его функциональные возможности.
Например, Вы можете позволить базовому классу красить холст в белый цвет, но в производном классе позволяете рисовать на холсте изображение. Здесь, директива dynamic позволяет коду расширяться, обогащаться .
Директива dynamic может сопровождаться директивой Abstract. Это изменяет эффект директивы Dynamic . Это означает, что текущий класс не должен кодировать метод - он здесь только как метка-заполнитель, чтобы напомнить и гарантировать, что полученные классы осуществят его.

Пример кода

// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем Unit1 и с формой
// названную Form1, которая имеет событие OnCreate названное FormCreate.
unit Unit1;

interface

uses
Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils;

type
// Определение базового класса TPolygon :
// Этот класс - треугольник если 3 стороны, квадрат если 4 стороны...
TPolygon = class
private
sideCount  : Integer;  // Сколько сторон?
sideLength : Integer;  // Какой длины каждая сторона?
shapeArea  : Double;   // Область многоугольника
protected
procedure setArea; Dynamic; Abstract;  // Должен быть осуществлен в дочернем
property count  : Integer read sideCount;
property length : Integer read sideLength;
property area   : Double  read shapeArea;
constructor Create(sides, length : Integer);
end;
// Определение потомков треугольника и квадрата
TTriangle = class(TPolygon)
protected
procedure setArea; override;   // Замена абстрактного метода
end;
TSquare = class(TPolygon)
protected
procedure setArea; override;   // Замена абстрактного метода
end;
// Определение класса формы используемой этим модулем
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm} // Вложение определений формы
// Создание объекта TPolygon
constructor TPolygon.Create(sides, length : Integer);
begin
// Сохранение числа и длины сторон
sideCount := sides;
sideLength := length;
// Установка области, используя метод setArea :
// Этот запрос будет удовлетворён только подклассом
setArea;
end;
// Выполнение родительского для треугольника абстрактного метода setArea
procedure TTriangle.setArea;
begin
// Вычисление и сохранение площади треугольника
shapeArea := (sideLength * sideLength) / 2;
end;
//  Выполнение родительского для квадрата абстрактного метода setArea
procedure TSquare.setArea;
begin
// Вычисление и сохранение площади квадрата
shapeArea := sideLength * sideLength;
end;
// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
var
triangle : TTriangle;
square   : TSquare;
begin
// Создание треугольника и квадрата
triangle := TTriangle.Create(3, 10);
square   := TSquare.Create(4, 10);
// Показ значений площади наших многоугольников :
ShowMessageFmt('Площадь тругольника = %f',[triangle.area]);
ShowMessageFmt('Площадь квадрата = %f',[square.area]);
end;
end.

Площадь тругольника = 50.0
Площадь квадрата = 100.0

Примечание

Dynamic семантически эквивалентна Virtual. Первый оптимизирован для памяти, последний для скорости.

Авторизация



Счетчики