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

We use cookies. Read the Privacy and Cookie Policy

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

Любой существующий класс, хранящийся во внешней 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;

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

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

* Методы расширения не могут быть виртуальными.

* Если метод расширения имеет то же имя, что и обычный метод, то предпочте5ние отдаётся обычному методу.