Методы расширения

Любой существующий класс, хранящийся во внешней dll, и все классы стандартной библитеки .NET можно расширить новыми методами. Такие методы расширения отличаются от обычных подпрограмм тем. что перед именем подпрограммы ставится имя расширяемого класса с точкой. Например:

procedure integer.Print;
begin
  write(Self)
end;

begin
  var i := 1;
  i.Print;
end.

Можно расширить интерфейс, тогда все классы, реализующие этот интерфейс, получат этот метод. Например, в системном модуле PABCSystem так расширен стандартный интерфейс IEnumerable<T> методом Print:

function System.Collections.Generic.IEnumerable<T>.Print(): IEnumerable<T>;
begin
  var g := Self.GetEnumerator();
  if g.MoveNext() then
    write(g.Current);
  while g.MoveNext() do
    write(' ', g.Current);
  Result := Self;
end;

В результате все классы, реализующие интерфейс IEnumerable<T>, расширяются методом Print:

function System.Collections.Generic.IEnumerable<T>.Print(): IEnumerable<T>;
begin
  var g := Self.GetEnumerator();
  if g.MoveNext() then
    write(g.Current);
  while g.MoveNext() do
    write(' ', g.Current);
  Result := Self;
end;

С помощью методов расширения можно перегружать операции.

Для методов расширения имеется ряд ограничений: