Delphi справочник - Форум программистов - Навигация  
 A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z      По первой букве  
System     SysUtils     StrUtils     DateUtils     FileCtrl     ConvUtils     StdConvs     Math     Classes     Dialogs     Types     Variants    ПО Unit   Compiler directives     Directives     Keywords     Types     Variables     Constants     Functions     Procedures    По категории  


Основы Delphi
Dynamic
Деректива
Позволяет методу класса быть заменённым в производных классах unit
  Function|Procedure declaration; Dynamic;
Описание
Директива 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
 



© Форум Delphi   |  Блог программистов   |  Создание и продвижение сайтов - "Веб сателлит"  |  Ссылки   |  Английская версия