![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедурный тип из интерфеса. [D5, D6, D7]
BasilAKANaiL © (2006-11-20 13:51:00)Доброе время суток, г-да. Девелоперы.
Возникла следующая проблема, поясню кратким примером:
//---------------------------------------------------
unit ...
interface
type
...
TDelegate1=function (Param1:Type):boolean of object;
ISession=interface(IIntreface)
function Func1(Param1:Type):boolean;
end;
TSession=class (TInterfacedObject, ISession)
function Func1(Param1:Type):boolean;
end;
...
var
Delegate:TDelegate1
aSession:ISession;
implementation
...
aSession:=TSession.Create;
Delegate:=aSession.Func1;
// ^здесь нужно взять процедурную ссылку из интерфеса, но компилятор этого не дает (воспринимая это как вызов функции Func1 - жалуется на отсутсвие параметров)
end.
//---------------------------------------------------
Теоритический можно было бы взять из интерфеса объект через QueryInterface() - с объектом, как раз все работает, но я думаю это лишний код.
BasilAKANaiL (2006-11-20 15:57:00) [1]Удалено модератором
Примечание: Выражения выбираем
Eraser (2006-11-20 15:47:00) [2]> [6] Barloggg (20.11.06 15:38)
не.. с методами такое не прокатывает )
Barloggg (2006-11-20 15:38:00) [3]а собаку поставить?
Delegate:=aSession.Func1;
это действительно вызов
а вот так будет присваивание
Delegate:=@aSession.Func1;
если я правильно помню...
Eraser (2006-11-20 15:26:00) [4]> [4] BasilAKANaiL © (20.11.06 15:20)
> 1.
да я понял зачем тут именно ISession, так правильнее.
> 2.
а зачем выцеплять объект? вроде требовалось выцепить просто указатель на метод, тогда такой способ должен подойти, т.к. интерфейсы и объекты вроде совместимы.
в крайнем случае решение есть - в той статье описано.
Я немного подзабыл как оно в деталях устроено, но в свое время перехват интерфейсных методов делал, так что в принципе зада решаема.
BasilAKANaiL (2006-11-20 15:20:00) [5]to Eraser
1. Обмен сообщениями в этом проекте в основном завязан на интерфесах? т.к. полиморфичность при этом выше.
В примере aSession:ISessionвзято намерено.
2. Напрямую выцепить объект из интерфеса по средствам приведения типов не получится - пример
> Delegate := TSession(aSession).Func1;
работать не будет. Я упоминул метод IInterface.QueryInterface - он как раз решает эту проблему, но подход дорогой по быстройдействию.
Eraser (2006-11-20 15:00:00) [6]или так
> Delegate:=aSession.Func1;
Delegate := TSession(aSession).Func1;
Eraser (2006-11-20 14:56:00) [7]> [0] BasilAKANaiL © (20.11.06 13:51)
стоп-стоп.. на самом деле все проще.. не так вопрос понял ))
> aSession:ISession;
TSession
:)
Eraser (2006-11-20 14:50:00) [8]> [0] BasilAKANaiL © (20.11.06 13:51)
можно ссылку "выдрать" напрямую из VTBL, вот хорошая статья http://www.rsdn.ru/article/com/qihook.xml
хотя скорее всего есть более простой способ :))