Example code : Implementing abstract virtual class methods
// 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;interfaceuses
Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils;type
// Define a base TPolygon class :
// This class is a traingle 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; // Must be implemented in child
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 square
shapeArea := (sideLength * sideLength) / 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.
为什么这里的子类可以使用父类的私有变量呢?
// 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;interfaceuses
Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils;type
// Define a base TPolygon class :
// This class is a traingle 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; // Must be implemented in child
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 square
shapeArea := (sideLength * sideLength) / 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.
为什么这里的子类可以使用父类的私有变量呢?
如果一个单元中定义了多个类,那么,它们默认是友员的关系,所以可以互相访问私有变量。