Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.214.230] |
|
Сообщ.
#1
,
|
|
|
Что это за код? Кто ведает подскажите!
type TIntFunc = reference to function: integer; IIntFunc = interface(TIntFunc) end; TIntFuncImpl = class(TInterfacedObject, IIntFunc) private FValue: integer; public constructor Create(AValue: integer); function Invoke: integer; end; { TIntFuncImpl } constructor TIntFuncImpl.Create(AValue: integer); begin FValue:= AValue; end; function TIntFuncImpl.Invoke: integer; begin Result:= FValue; end; begin end. Причем метод Invoke требует компилятор, говоря что он объявлен в IIntFunc, но как видите его там нет поэтому я его определил в TIntFuncImpl. |
Сообщ.
#2
,
|
|
|
Он объявлен в предке IIntFunc, в TIntFunc;
TIntFunc = reference to function: integer; - эквивалентно TIntFunc = interface function Invoke: Integer; end; |
Сообщ.
#3
,
|
|
|
Цитата jack128 @ Он объявлен в предке IIntFunc, в TIntFunc; TIntFunc = reference to function: integer; - эквивалентно TIntFunc = interface function Invoke: Integer; end; О как Те. ссылка на функцию это есть интерфейс? И почему тогда вот это не компилируется? TIntFunc = interface function Invoke: Integer; end; var func: TIntFunc; begin func:= function: integer begin Result:= 100; end; end. Ведь так юзают определение анонимной функции. И почему то у меня не компилируется: var func: IIntFunc; begin func:= TIntFuncImpl.Create(100); Writeln(func.Invoke.ToString); //<-- [dcc32 Error]: E2003 Undeclared identifier: 'Invoke' end. |
Сообщ.
#4
,
|
|
|
В итоге код скомпилился
Думаю что так и есть определение ссылки на функцию это есть функциональный интерфейс, т.е. интерфейс и один методом. Этот интерфейс определяет тип анонимки. |