unit Hat;
{$mode objfpc}{$H+}
interface
uses
  Classes,SysUtils,Dialogs;
type
  THat = class //Hat is a CLASS and is child of TObject (inherited)
                    //All delphi classes have TObject as root father. This is not true in C++
		    //Thats why in delphi the Multiple inheritance DOES NOT EXIST
		    //Every class has at MAX ONE Father in Delphi
//We have :
//1. Class Attributes (var ...)
//2. Class Methods (constructors, destructor, class static)
//3. Object Attributes (id,name...)
//4. Object Methods (Get,Set...)
  private //PRIVATE ZONE (Only the Class employee can SEE this zone)
    //PRIVATE ATTRIBUTES
    Name: string;  //I suppose name is an unique ID too....    //Private Object Attribute
    Color: string;                                       //Private Object Attribute
    IsAvailable: boolean;
    //PRIVATE METHODS
    //procedure Fake();                                    //Private Object Method
    //...
    //class function x(): integer;                         //Private Class Method (class->static in c++)
  protected //PROTECTED ZONE (Only the Class employee and his children can SEE this zone)
     //We will see this later on the inheritance
  public   //PUBLIC (Anyone can see this zone)
    //PUBLIC ATTRIBUTES
    //Id_public: integer;                                  //Public Object Attribute (bad NO encapsulation! Object attributes must be private)
    //...
    //PUBLIC METHODS
    //Constructors (Create the object Employee):
    constructor Create(Name_,Color_ : string); overload; //Public Class Method
    //The Overload allows you to have different versions of the same named function/procedure with different arguments
    //OVERLOAD : SAME NAME OF FUNCTION WITH DIFFERENT ARGUMENTS IN THE SAME CLASS
    //Destructor (can be only ONE) (Destroy the object Employee)
    Destructor Destroy; override;                          //Public Class Method
    //The Override must be specified since we are overriding the virtual TObject destroy method.
    //At the end of a destructor, you should call Inherited to invoke the parent destructor.
    //OVERRIDE : SAME NAME OF FUNCTION WITH SAME ARGUMENTS IN DIFFERENT CLASSES
    //class function x(): integer;                         //Public Class Method (class->static in c++)
    function GetName():string;                             //Public Object Method
    procedure SetName(Name_:string);                       //Public Object Method
    function GetColor():string;                          //Public Object Method
    procedure SetColor(Color_:string);                 //Public Object Method
    function GetIsAvailable():boolean;                          //Public Object Method
    procedure SetIsAvailable(IsAvailable_:boolean);                 //Public Object Method
    function PrintMe():string;                             //Public Object Method
  end;
implementation
//uses unit1;
//var
//  Counter: integer =0;    //Class Attribute SOS !!!
//implementation of the methods here !!!
//Class Method
constructor THat.Create(Name_,Color_ : string); overload;
begin
  self.Name:=Name_;
  self.Color:=Color_;
  self.IsAvailable := true; //A new hat is always available
end;
//Class Method
Destructor THat.Destroy; //override; //not needed here !!!
begin
  showmessage('Hat with name' + self.Name + ' and with color ' + self.Color + ' is deleted');
  //Self->This in c++
  inherited; // Always call the parent destructor after running your own code
end;
//Object Method
function THat.GetName():string;
begin
  result := self.Name;
end;
//Object Method
procedure THat.SetName(Name_:string);
begin
 self.Name := Name_;
end;
//Object Method
function THat.GetColor():string;
begin
  result := self.Color;
end;
//Object Method
procedure THat.SetColor(Color_:string);
begin
  self.Color := Color_;
end;
//Object Method
function THat.GetIsAvailable():boolean;
begin
  result := self.IsAvailable;
end;
//Object Method
procedure THat.SetIsAvailable(IsAvailable_:boolean);
begin
  self.IsAvailable := IsAvailable_;
end;
//Object Method
function THat.PrintMe():string;
begin
  result:= 'The selected hat has name : ' + self.Name + ' , color : ' + self.color + ' and is available : ' + booltostr(self.IsAvailable);
end;
end.
That's all for now!
Thank you for your patience.
See you on next article!