AbstractErrorProc

Печать
Рейтинг пользователей: / 0
ХудшийЛучший 

 


AbstractErrorProc

Описание

Переменная 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.

Площадь квадрата = 100.0
Ошибка : Вызван абстрактный метод.

Затем программа заканчивается с диалогом ошибки:

Runtime error 210 at 00452208

Примечание

Вы должны избегать вызова абстрактных методов.