Difference between revisions of "Inherited"

From Lazarus wiki
Jump to navigationJump to search
(brief description of inherited according to fp documentation)
 
 
(6 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{inherited}}
+
{{Inherited}}
<br><br>
+
 
In an overridden virtual method, it is often necessary to call the parent class’ implementation of the virtual method. This can be done with the '''inherited''' keyword. Likewise, the '''inherited''' keyword can be used to call any method of the parent class.
+
 
 +
Back to [[Reserved words]].
 +
 
 +
 
 +
In an overridden virtual [[Method|method]], it is often necessary to call the parent [[Class|<syntaxhighlight lang="pascal" inline>class</syntaxhighlight>]]’ implementation of the virtual method.  
 +
This can be done with the <syntaxhighlight lang="pascal" inline>inherited</syntaxhighlight> [[Reserved word|reserved word]]. Likewise, the <syntaxhighlight lang="pascal" inline>inherited</syntaxhighlight> [[Keyword|keyword]] can be used to call any method of the parent <syntaxhighlight lang="pascal" inline>class</syntaxhighlight>.
  
 
This case is the simplest:  
 
This case is the simplest:  
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
Type   
 
Type   
 
   TMyClass = Class(TComponent)   
 
   TMyClass = Class(TComponent)   
Line 15: Line 20:
 
   Inherited;   
 
   Inherited;   
 
   // Do more things   
 
   // Do more things   
 +
end;
 +
</syntaxhighlight>
 +
 +
== Constructors and destructors case ==
 +
 +
[[Constructor|<syntaxhighlight lang="pascal" inline>Constructor</syntaxhighlight>]], example 1 :
 +
<syntaxhighlight lang=pascal>
 +
  ...
 +
  TTest.Create;
 +
  begin
 +
    Inherited; // Always at the beginning of the constructors and start the constructor (code only) of the parent class
 +
    ...
 +
  end;
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight lang="pascal" inline>Constructor</syntaxhighlight>, example 2 :
 +
<syntaxhighlight lang=pascal>
 +
  ...
 +
  TTest.Create(...);
 +
  begin
 +
    Inherited Create(...); // Always at the beginning of the constructors and start the constructor (code only) of the parent class
 +
    ...
 +
  end;
 +
  ...
 +
</syntaxhighlight>
 +
 +
[[Destructor|<syntaxhighlight lang="pascal" inline>Destructor</syntaxhighlight>]], example 3 :
 +
<syntaxhighlight lang=pascal>
 +
  TTest.Destroy;
 +
  begin
 +
    ...
 +
    Inherited;  // Always at the end of the destructors and start the destructor (code only) of the parent class
 +
  end;
 +
  ...
 +
</syntaxhighlight>
 +
 +
== Virtual methods override ==
 +
 +
<syntaxhighlight lang="pascal">
 +
type 
 +
  TMyClass = class(TStrings) 
 +
    function GetObject(Index: Integer): TObject; override; 
 +
  end;
 +
 +
function TMyClass.GetObject(Index: Integer): TObject;
 +
begin
 +
  // Get result from parent class method
 +
  Result := inherited GetObject(Index); 
 +
  // Do something 
 
end;  
 
end;  
 
</syntaxhighlight>
 
</syntaxhighlight>

Latest revision as of 17:16, 6 August 2022

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru)


Back to Reserved words.


In an overridden virtual method, it is often necessary to call the parent class’ implementation of the virtual method. This can be done with the inherited reserved word. Likewise, the inherited keyword can be used to call any method of the parent class.

This case is the simplest:

Type  
  TMyClass = Class(TComponent)  
    Constructor Create(AOwner : TComponent); override;  
  end; 

Constructor TMyClass.Create(AOwner : TComponent);  
begin  
  Inherited;  
  // Do more things  
end;

Constructors and destructors case

Constructor, example 1 :

  ...
  TTest.Create;
  begin
    Inherited; // Always at the beginning of the constructors and start the constructor (code only) of the parent class
    ...
  end;

Constructor, example 2 :

  ...
  TTest.Create(...);
  begin
    Inherited Create(...); // Always at the beginning of the constructors and start the constructor (code only) of the parent class
    ...
  end;
  ...

Destructor, example 3 :

  TTest.Destroy;
  begin
    ...
    Inherited;  // Always at the end of the destructors and start the destructor (code only) of the parent class
  end;
  ...

Virtual methods override

type  
  TMyClass = class(TStrings)  
    function GetObject(Index: Integer): TObject; override;  
  end; 

function TMyClass.GetObject(Index: Integer): TObject;
begin
  // Get result from parent class method 
  Result := inherited GetObject(Index);  
  // Do something  
end;