Переменная AbstractErrorProc указывает для Delphi процедуру, которая должна быть вызвана когда ваш код ошибочно вызывает абстрактный метод класса. Абстрактные методы являются методами метками - заполнителями, осуществляемыми только полученными классами. Родительский класс реально является скелетным классом, и поэтому не должен проиллюстрирован в объекте. Delphi вас предупреждает, если вы вызывете абстрактный метод, он перед завершением с ошибкой вызовет AbstractErrorProc. Если не найден, то вместо этого выбрасывается исключение EAbstractError.
|
// Полный код Модуля. // ----------------------------------------------------------- // Вы должны поместить этот код в модуль с именем 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; // Не может закодировать пока стороны не известны published property count : Integer read sideCount; property length : Integer read sideLength; property area : Double read shapeArea; constructor Create(sides, length : Integer); 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 TSquare.setArea; begin // Вычисление и сохранение площади треугольника shapeArea := sideLength * sideLength; end; procedure ReportAbstractError; begin // Сообщение об ошибке ShowMessage('Ошибка : Вызван абстрактный метод.'); end; // Основная линия кода procedure TForm1.FormCreate(Sender: TObject); var square : TSquare; polygon : TPolygon; begin // Установка процедуры для перехвата вызовов abstract ошибок AbstractErrorProc := Addr(ReportAbstractError); // Создание квадрата square := TSquare.Create(4, 10); // Показ площади квадрата ShowMessageFmt('Площадь квадрата = %f',[square.area]); // Попытка создать многоугольник (внутренне вызывая абстрактный метод) polygon := TPolygon.Create(2, 10); // Бессмысленная форма! // Показ площади многоугольника ShowMessageFmt('Площадь многоугольника = %f',[polygon.area]); end; end.
|