Difference between revisions of "Inherited/ru"

From Lazarus wiki
Jump to navigationJump to search
 
Line 1: Line 1:
 
{{Inherited}}
 
{{Inherited}}
  
В переопределяемом виртуальном [[Method |методе]] часто необходимо вызывать реализацию виртуального метода родительского [[Class/ru|<syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlight>]].
+
В переопределяемом виртуальном [[Method |методе]] часто необходимо вызывать реализацию виртуального метода родительского [[Class/ru|<syntaxhighlight lang="pascal" inline>class</syntaxhighlight>]].
Это можно сделать с помощью [[Reserved_word/ru|зарезервированного слова]] <syntaxhighlight lang="pascal" enclose="none">inherited</syntaxhighlight>. Аналогично, [[Keyword/ru| ключевое слово]] <syntaxhighlight lang="pascal" enclose="none">inherited</syntaxhighlight> может использоваться для вызова любого метода родительского <syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlight>.
+
Это можно сделать с помощью [[Reserved_word/ru|зарезервированного слова]] <syntaxhighlight lang="pascal" inline>inherited</syntaxhighlight>. Аналогично, [[Keyword/ru| ключевое слово]] <syntaxhighlight lang="pascal" inline>inherited</syntaxhighlight> может использоваться для вызова любого метода родительского <syntaxhighlight lang="pascal" inline>class</syntaxhighlight>.
  
 
Вот простейший пример:  
 
Вот простейший пример:  
Line 21: Line 21:
 
== Случаи конструкторов и деструкторов ==
 
== Случаи конструкторов и деструкторов ==
  
[[Constructor/ru|<syntaxhighlight lang="pascal" enclose="none">Constructor</syntaxhighlight>]], Пример 1 :
+
[[Constructor/ru|<syntaxhighlight lang="pascal" inline>Constructor</syntaxhighlight>]], Пример 1 :
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
   ...
 
   ...
Line 31: Line 31:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<syntaxhighlight lang="pascal" enclose="none">Constructor</syntaxhighlight>, Пример 2 :
+
<syntaxhighlight lang="pascal" inline>Constructor</syntaxhighlight>, Пример 2 :
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
   ...
 
   ...
Line 42: Line 42:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
[[Destructor|<syntaxhighlight lang="pascal" enclose="none">Destructor</syntaxhighlight>]], Пример 3 :
+
[[Destructor|<syntaxhighlight lang="pascal" inline>Destructor</syntaxhighlight>]], Пример 3 :
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
   TTest.Destroy;
 
   TTest.Destroy;

Latest revision as of 17:12, 6 August 2022

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

В переопределяемом виртуальном методе часто необходимо вызывать реализацию виртуального метода родительского class. Это можно сделать с помощью зарезервированного слова inherited. Аналогично, ключевое слово inherited может использоваться для вызова любого метода родительского class.

Вот простейший пример:

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

Constructor TMyClass.Create(AOwner : TComponent);  
begin  
  Inherited;  
  // Что-то делаем еще  
end;

Случаи конструкторов и деструкторов

Constructor, Пример 1 :

  ...
  TTest.Create;
  begin
    Inherited; // Ставится всегда в начале конструктора и запускает конструктор (только код) родительского класса
    ...
  end;

Constructor, Пример 2 :

  ...
  TTest.Create(...);
  begin
    Inherited Create(...); // Ставится всегда в начале конструктора и запускает конструктор (только код) родительского класса
    ...
  end;
  ...

Destructor, Пример 3 :

  TTest.Destroy;
  begin
    ...
    Inherited;  // Ставится всегда в конце деструктора и запускает деструктор (только код) родительского класса
  end;
  ...

Переопределение виртуальных методов

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

function TMyClass.GetObject(Index: Integer): TObject;
begin
  // Получаем результат из метода родительского класса 
  Result := inherited GetObject(Index);  
  // Делаем что-нибудь дальше
end;