Difference between revisions of "Inherited/ru"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Inherited}} In an overridden virtual method, it is often necessary to call the parent Class|<syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlig...")
 
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{Inherited}}
 
{{Inherited}}
  
 +
В переопределяемом виртуальном [[Method |методе]] часто необходимо вызывать реализацию виртуального метода родительского [[Class/ru|<syntaxhighlight lang="pascal" inline>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>.
  
In an overridden virtual [[Method|method]], it is often necessary to call the parent [[Class|<syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlight>]]’ implementation of the virtual method.
+
Вот простейший пример:
This can be done with the <syntaxhighlight lang="pascal" enclose="none">inherited</syntaxhighlight> [[Reserved word|reserved word]]. Likewise, the <syntaxhighlight lang="pascal" enclose="none">inherited</syntaxhighlight> [[Keyword|keyword]] can be used to call any method of the parent <syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlight>.
 
  
This case is the simplest:
+
<syntaxhighlight lang=pascal>
 
 
<syntaxhighlight>
 
 
Type   
 
Type   
 
   TMyClass = Class(TComponent)   
 
   TMyClass = Class(TComponent)   
Line 16: Line 15:
 
begin   
 
begin   
 
   Inherited;   
 
   Inherited;   
   // Do more things  
+
   // Что-то делаем еще  
 
end;  
 
end;  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== constructors and destructors case ==
+
== Случаи конструкторов и деструкторов ==
  
[[Constructor|<syntaxhighlight lang="pascal" enclose="none">Constructor</syntaxhighlight>]], example 1 :
+
[[Constructor/ru|<syntaxhighlight lang="pascal" inline>Constructor</syntaxhighlight>]], Пример 1 :
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   ...
 
   ...
 
   TTest.Create;
 
   TTest.Create;
 
   begin
 
   begin
     Inherited; // Always at the beginning of the constructors and start the constructor (code only) of the parent class
+
     Inherited; // Ставится всегда в начале конструктора и запускает конструктор (только код) родительского класса
 
     ...
 
     ...
 
   end;
 
   end;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<syntaxhighlight lang="pascal" enclose="none">Constructor</syntaxhighlight>, example 2 :
+
<syntaxhighlight lang="pascal" inline>Constructor</syntaxhighlight>, Пример 2 :
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   ...
 
   ...
 
   TTest.Create(...);
 
   TTest.Create(...);
 
   begin
 
   begin
     Inherited Create(...); // Always at the beginning of the constructors and start the constructor (code only) of the parent class
+
     Inherited Create(...); // Ставится всегда в начале конструктора и запускает конструктор (только код) родительского класса
 
     ...
 
     ...
 
   end;
 
   end;
Line 43: Line 42:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
[[Destructor|<syntaxhighlight lang="pascal" enclose="none">Destructor</syntaxhighlight>]], example 3 :
+
[[Destructor|<syntaxhighlight lang="pascal" inline>Destructor</syntaxhighlight>]], Пример 3 :
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   TTest.Destroy;
 
   TTest.Destroy;
 
   begin
 
   begin
 
     ...
 
     ...
     Inherited;  // Always at the end of the destructors and start the destructor (code only) of the parent class
+
     Inherited;  // Ставится всегда в конце деструктора и запускает деструктор (только код) родительского класса
 
   end;
 
   end;
 
   ...
 
   ...
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== virtual methods override ==
+
== Переопределение виртуальных методов ==
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 63: Line 62:
 
function TMyClass.GetObject(Index: Integer): TObject;
 
function TMyClass.GetObject(Index: Integer): TObject;
 
begin
 
begin
   // Get result from parent class method
+
   // Получаем результат из метода родительского класса
 
   Result := inherited GetObject(Index);   
 
   Result := inherited GetObject(Index);   
   // Do something 
+
   // Делаем что-нибудь дальше
 
end;  
 
end;  
 
</syntaxhighlight>
 
</syntaxhighlight>

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;