43 lines
1.2 KiB
ObjectPascal
43 lines
1.2 KiB
ObjectPascal
|
|
var i: integer;
|
|||
|
|
type
|
|||
|
|
|
|||
|
|
TBase = class
|
|||
|
|
|
|||
|
|
// Эта FErr должна быть шаблонная и принимать функцию возвращающую шаблонный параметр (T)
|
|||
|
|
procedure PErr<T>(f: object->T) := exit;
|
|||
|
|
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TErr<T> = class(TBase)
|
|||
|
|
|
|||
|
|
// А у этой PErr не важно какое возвращаемое значение f
|
|||
|
|
procedure PErr(f: T->byte);
|
|||
|
|
begin
|
|||
|
|
f(default(T));
|
|||
|
|
i := 1;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure p1;
|
|||
|
|
begin
|
|||
|
|
|
|||
|
|
// Обязательно "self.", без него не воспроизводится
|
|||
|
|
self.PErr(o->
|
|||
|
|
begin
|
|||
|
|
var p: T->() := procedure(x)->exit;
|
|||
|
|
|
|||
|
|
// Обязательно передача в любую процедуру / функцию (не обязательно процедурную переменную)
|
|||
|
|
// При присвоении переменной не воспроизводится
|
|||
|
|
p(o); //Ошибка: Нельзя преобразовать тип object к T
|
|||
|
|
|
|||
|
|
Result := 0;
|
|||
|
|
end);
|
|||
|
|
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
begin
|
|||
|
|
var o := new TErr<integer>;
|
|||
|
|
o.p1;
|
|||
|
|
assert(i = 1);
|
|||
|
|
end.
|