|
Abstract
Определяет метод класса, реализуемый только в подклассе
Function|Procedure declaration; Virtual; Abstract;
Описание:
Директива Abstract определяет метод класса как реализуемый только в классах-наследниках. Он абстрактен в смысле того, что является "заглушкой" - он не имеет реализации в текущем классе, но должен быть реализован классах-наследниках.
Это используется в том случае, когда базовый класс рассматривается как класс-"скелет". Такие классы никогда не используются напрямую - только основанные на них классы используются для создания объектов этих классов.
Например, класс TAnimal может иметь абстрактный метод для задания движения животного. Только когда создается, скажем, класс TCat, основанный на TAnimal, вы можете реализовать этот метод. В этом экземпляре, кот передвигается с помощью ходьбы.
Класс Abstract должен использоваться при определении виртуального класса, так как мы не создали реализацию класса (см. Virtual для деталей)
Пример кода:
// Full Unit code.
//
-----------------------------------------------------------
// You must
store this code in a unit called Unit1 with a form
// called Form1 that has
an OnCreate event called FormCreate.
unit Unit1;
interface
uses
Forms, Dialogs, Classes, Controls, StdCtrls,
SysUtils;
type
// Define a base TPolygon class :
// This class is a triangle if 3 sides, square if 4 sides ...
TPolygon = class
private
sideCount : Integer; // How many sides?
sideLength : Integer; // How long each side?
shapeArea : Double; // Area of the polygon
protected
procedure setArea; Virtual; Abstract; //
Cannot code until sides known
published
property count : Integer read sideCount;
property length : Integer read sideLength;
property area : Double read shapeArea;
constructor Create(sides, length : Integer);
end;
// Define triangle and square descendents
TTriangle = class(TPolygon)
protected
procedure setArea; override; // Override the abstract method
end;
TSquare = class(TPolygon)
protected
procedure setArea;
override; // Override the abstract method
end;
// Define the form class used by this unit
TForm1 = class(TForm)
procedure FormCreate(Sender:
TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm} // Include form definitions
//
Create the TPolygon object
constructor TPolygon.Create(sides, length :
Integer);
begin
// Save the number and length of the sides
sideCount := sides;
sideLength := length;
// Set the area using the abstract setArea method :
// This call will be satisfied only by a subclass
setArea;
end;
// Implement the abstract setArea
parent method for the triangle
procedure TTriangle.setArea;
begin
// Calculate and save the area of the triangle
shapeArea := (sideLength * sideLength*0.866) / 2;
end;
// Implement
the abstract setArea parent method for the square
procedure TSquare.setArea;
begin
// Calculate and save the area of the square
shapeArea := sideLength * sideLength;
end;
// Main
line code
procedure TForm1.FormCreate(Sender: TObject);
var
triangle : TTriangle;
square : TSquare;
begin
// Create a triangle and a square
triangle := TTriangle.Create(3, 10);
square :=
TSquare.Create(4, 10);
// Show the areas of our
polygons:
ShowMessageFmt('Triangle area = %f',[triangle.area]);
ShowMessageFmt('Square area = %f',[square.area]);
end;
end.
Результат выполнения:
Triangle area = 43.3
Square area = 100.0
|
|