ObjectPascal
Protected
Directive
Starts a section of class private data accesible to sub-classes
  type Class declaration
  Protected
    Field | Property | Method declaration
  {...}
  end;
Description
The Protected directive starts a declaration section of a class definition. In a protected section, Fields, Properties and Methods are declared to be accessible to this class and classes descending from it. But not accessible externally by class users.
 
It is similar to the Private directive - it hides the internal implementation of a class, but does not hide such data and methods from subclasses.
 
In general, most data and methods internal to a class should be defined in a Protected section. This gives subclasses often useful access to these. Only use Private when you are sure that you want to keep stuff entirely local to the current class/unit. This may be true when a subclass would want to be shielded from parent class complexities.
 
You might want to make protected methods virtual to allow subclasses to alter them to suit their needs.
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
Public Starts an externally accessible section of a class
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 protected method to access private data in the parent clas
// 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 TSquare 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;

procedure TForm1.FormCreate(Sender: TObject);
var
  mySquare : TChangeableSquare;
begin
  // Create a changeable square
  mySquare := TChangeableSquare.Create(30, 40);

  // What is the square area now?
  WriteLn('Square 30,40 area = '+IntToStr(mySquare.area));

  // Change the square dimensions
  mySquare.ChangeSize(10,20);

  // What is the square area now?
  WriteLn('Square 10,20 area = '+IntToStr(mySquare.area));
end;

end.
   Square 30,40 area = 1200
   Square 10,20 area = 200