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