Description |
The Public directive starts a declaration section of a class definition. In a public section, Fields, Properties and Methods are declared to be accessible to this class, classes descending from it, and code using object instances of the class.
In Object Oriented terms, a class object is seen as a black box. The internal operations are not relevant. Public fields, properties and methods are the externally visible part of an object - a controlled access to the internals of the class.
Because public acceess provides a linkage of sorts to external code, you should avoid wherever possible making changes to the public section.
A Published section is very similar to a Public section, except that it provides some run time information.
|
| Notes | Warning : avoid making fields public - it is always better to define a property to access them instead. This provides some decoupling from the internals of the class.
| | Related commands | Function | | Defines a subroutine that returns a value | Private | | Starts the section of private data and methods in a class | Procedure | | Defines a subroutine that does not return a value | Property | | Defines controlled access to class fields | Protected | | Starts a section of class private data accesible to sub-classes | Published | | Starts a published externally accessible section of a class | Type | | Defines a new category of variable or process |
|
Download this web site as a Windows program.
|
|
|
|
Example code : A subclass that uses a public method to access internal data and 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;
interface
uses
Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils;
type
 // Define a base TSquare class :
 // It has private data that can only be set by a protected method
TSquare = class
private // Only known to the parent class
squareArea : Integer;
protected // Known to all classes in the hierarachy
squareWidth, squareHeight : Integer;
procedure setArea;
Public  // Known externally by class users
property width : Integer read squareWidth;
property height : Integer read squareHeight;
property area : Integer read squareArea;
published // Known externally : has run time info also
constructor Create(width, height : Integer);
end;
 // Define a descendant type :
 // It must use the parent protected method to set the
 // private area of the square
TChangeableSquare = class(TSquare)
Public
procedure ChangeSize(newWidth, newHeight : Integer);
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 TSquare object
constructor TSquare.Create(width, height: Integer);
begin
 // Save the width and height in protected fields
squareWidth := width;
squareHeight := height;
 // And calculate the square area
setArea;
end;
// Change the TChnageableSquare dimensions
procedure TChangeableSquare.ChangeSize(newWidth, newHeight: Integer);
begin
 // Over-write the original width and height values
squareWidth := newWidth;
squareHeight := newHeight;
 // And re-calculate the square area
setArea;
end;
// Set the square size from its dimensions
procedure TSquare.setArea;
begin
 // Calculate the square area and store privately
squareArea := width * height;
end;
// Main line code
procedure TForm1.FormCreate(Sender: TObject);
var
mySquare : TChangeableSquare;
begin
 // Create a changeable square
mySquare := TChangeableSquare.Create(30, 40);
 // What is the square area now?
ShowMessage('Square 30,40 area = '+IntToStr(mySquare.area));
 // Change the square dimensions
mySquare.ChangeSize(10,20);
 // What is the square area now?
ShowMessage('Square 10,20 area = '+IntToStr(mySquare.area));
end;
end.
| |
Square 30,40 area = 1200
Square 10,20 area = 200 |
|
|