Разное
Облака / Clouds
The bast cloud service
Get 20 GB free!!!
Support WebDav.
Show more >>
time-tested cloud storage
Support WebDav.
Последние книги
Самое популярное
Все бесплатно
Все ссылки на файлы, расположенные на страницах сайта, добавлены пользователями и доступны для бесплатного скачивания. За содержание этих файлов администрация сайта ответственности не несет.
Навигация
Вопросы
Затенение компонента определенным цветом
Категория: Компоненты
Категория: Компоненты
Компонент StatusBar
Категория: Компоненты
Категория: Компоненты
Тpансляция ошибок в BDE
Категория: Базы данных
Категория: Базы данных
Создание ярлыка на Рабочем столе
Категория: Приложение
Категория: Приложение
Последний день месяца
Категория: Базы данных
Категория: Базы данных
Как подключить или отключить сетевой диск
Категория: Интернет и Сети
Категория: Интернет и Сети
Как получить дату создания файла
Категория: Файловая система
Категория: Файловая система
Cколько файлов есть в определённой папке
Категория: Файловая система
Категория: Файловая система
Вывод текста на канву Canvas
Категория: Компоненты
Категория: Компоненты
Программно скрыть MainMenu
Категория: Компоненты
Категория: Компоненты
Delphi - Справочник: Dynamic
Dynamic
|
Function|Procedure declaration; Dynamic; |
Деректива (Unit )
|
Позволяет методу класса быть заменённым в производных классах
|
Описание:
|
Директива 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. Первый оптимизирован для памяти, последний для скорости. |