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). |