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.
 
为什么这里的子类可以使用父类的私有变量呢?

解决方案 »

  1.   

    我放在另外一个单元里了,是不能访问了,可是连TTriangle.setArea;这个方法也不能用了
      

  2.   

    在ObjectPascal中,
    如果一个单元中定义了多个类,那么,它们默认是友员的关系,所以可以互相访问私有变量。
      

  3.   

    我放在另外一个单元里了,是不能访问了,可是连TTriangle.setArea;这个方法也不能用了-----------------------------------------------------------估计是这个单元没有引用父类所在的单元。