Все бесплатно
    Все ссылки на файлы, расположенные на страницах сайта, добавлены пользователями и доступны для бесплатного скачивания. За содержание этих файлов администрация сайта ответственности не несет.



Вопросы
  Как найти наибольший общий делитель
   Категория: Математика
  Undo в memo
   Категория: Компоненты
  Упаковка ZIPTV
   Категория: Компоненты
  Перекодировка в DBASE
   Категория: Базы данных
  Компоненты TrackBar и ScrollBar
   Категория: Компоненты
  Изменить пароль для Paradox
   Категория: Базы данных
  Подсветить часть текста в DBGrid
   Категория: Компоненты
  Получить имена всех папок и файлов в директории
   Категория: Файловая система

Delphi - Справочник: AbstractErrorProc

ABCDEFGHIJKLMNOPQRSTUVWXYZ

  << Вернуться  

 AbstractErrorProc
var AbstractErrorProc : Pointer;
Переменная (Unit System)
Определяет процедуру, вызываемую при вызыве абстрактного метода
Описание:
Переменная 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
Примечание:
Вы должны избегать вызова абстрактных методов.

  << Вернуться