6.5.6 Стасический метод класса

Вверх  Предыдущий  Следующий

FPC понимает и статические методы классов: это методы класса, у которых есть ключевое слово Static после объявления метода. Эти методы ведут себя как обычные процедуры или функции. Это значит, что:

Они не имеют параметра Self. А значит они не могут получить доступ к обычными свойствам, полям или методами.

Они не могут быть виртуальными.

С ними можно обращаться как с обычными процедурными переменными или функциями.

Их используют, в основном, для включения методов в пространстве имен класса, и вместо процедур (и функций) в пространстве имен модуля. Обратите внимание, что они имеют доступ ко всем переменным класса, типам и т.д. Далее показано как это можно сделать:

{$mode objfpc}

{$h+}

 

Type

  TA = Class(TObject)

    Private

      class var myprivatea : integer;

    public

      class Function GetA : Integer;static;

      class Procedure SetA(AValue : Integer);static;

  end;

 

Class Function TA.GetA : Integer;

begin

  Result := myprivateA;

end;

 

Class Procedure TA.SetA(AValue : integer);

begin

  myprivateA := AValue;

end;

 

begin

  TA.SetA(123);

  Writeln(TA.MyPrivateA);

end.

Пример будет выводить 123.

В коде реализации статического метода класса, недоступен идентификатор Self. Метод ведет себя так, как будто он жёстко привязан к классу (всем классам), а не к экземпляру класса, из которого он был вызван. В обычных методов класса, Self содержит класс, который вызвал метод. Следующий пример проясняет ситуацию:

Type

  TA = Class

    Class procedure DoIt; virtual;

    Class Procedure DoitStatic;static;

  end;

 

TB = CLass(TA)

  Class procedure DoIt; override;

end;

 

Class procedure TA.DOit;

begin

  Writeln('TA.Doit : ',Self.ClassName);

end;

 

Class procedure TA.DOitStatic;

begin

  Doit;

  Writeln('TA.DoitStatic : ',ClassName);

end;

 

Class procedure TB.DoIt;

begin

  Inherited;

  Writeln('TB.Doit : ',Self.ClassName);

end;

 

begin

  Writeln('С помощью статического метода:');

  TB.DoItStatic;

  Writeln('С помощью метода класса:');

  TB.Doit;

end.

При запуске, пример выведет:

С помощью статического метода:

TA.Doit : TA

TA.DoitStatic : TA

С помощью метода класса:

TA.Doit : TB

TB.Doit : TB

Для статического метода класса, даже если он вызван с использованием класса TB, (Self, если он доступен) установлен в TA, где и был определен статический метод класса. Для метода класса, класс (Self) устанавливается на фактический класс, используемый для вызова метода (TB).