Описание |
Директива Dynamic позволяет методу класса быть отменой (замененной) так же названным методом в производном классе.
Вы можете пометить функцию или процедуру как Dynamic , когда вы хотите позволить программисту, который создает класс, основанный на вашем классе, заменить его функциональные возможности.
Например, Вы можете позволить базовому классу красить холст в белый цвет, но в производном классе позволяете рисовать на холсте изображение. Здесь, директива dynamic позволяет коду расширяться, обогащаться .
Директива dynamic может сопровождаться директивой Abstract. Это изменяет эффект директивы Dynamic . Это означает, что текущий класс не должен кодировать метод - он здесь только как метка-заполнитель, чтобы напомнить и гарантировать, что полученные классы осуществят его.
|
|
Примечания |
Dynamic семантически эквивалентна Virtual. Первый оптимизирован для памяти, последний для скорости.
|
|
Похожие команды |
Abstract Определяет метод класса, осуществляемый только в подклассах
Class Начинает объявление типа объектного класса
Function Определяет подпрограмму, которая возвращает значение
Procedure Определяет подпрограмму, которая не возвращает значение
Overload Позволяет 2-м или более подпрограммам иметь одинаковое название
Override Определяет метод, который заменяет виртуальный родительский метод класса
Virtual Позволяет методу класса быть отменённым в производных классах
| |
|
Пример кода : Осуществление абстрактных динамических методов класса |
// Полный код Модуля. // ----------------------------------------------------------- //
Вы должны поместить этот код в модуль с именем 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
|
|