| 
| 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 |  |  |  | 
| Example code : A sublass 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
 
 |  |