среда, 30 октября 2013 г.

"Протоколы" на "коленке"

Предыдущая "скажем серия" тут - http://18delphi.blogspot.ru/2013/10/blog-post_8453.html

Теперь как организовать "протоколы" без изменения компилятора.

Пусть есть "мета-код":
PmyProtocol = protocol
 procedure Method1;
 function Method2: Boolean;
end;//PmyProtocol

TmyObject1 = class(TSomeParent1, implements PmyProtocol)
 procedure Method1;
 function Method2: Boolean;
end;//TmyObject1 

TmyObject2 = class(TSomeParent2, implements PmyProtocol)
 procedure Method1;
 function Method2: Boolean;
end;//TmyObject2 

Теперь что "на реальном языке":
type
 TMethod1Prototype = procedure of object;
 TMethod2Prototype = function : Boolean of object;

PmyProtocol = object
 method1 : TMethod1Prototype;
 method2 : TMethod2Prototype;
 constructor Create(aMethod1 : TMethod1, aMethod2 : TMethod2);
end;//PmyProtocol

PmyProtocolFactory.Register(TmyObject1, PmyProtocol.Create(TmyObject1(nil).MyMethod1, TmyObject1(nil).MyMethod2));
PmyProtocolFactory.Register(TmyObject2, PmyProtocol.Create(TmyObject2(nil).MyMethod1, TmyObject2(nil).MyMethod2));

var
 someObject1 : TMyObject1;
PmyProtocolFactory.Call(someObject1).method1;
someBoolean := PmyProtocolFactory.Call(someObject1).method2;

var
 someObject2 : TMyObject2;
PmyProtocolFactory.Call(someObject2).method1;
someBoolean := PmyProtocolFactory.Call(someObject2).method2;

fuction PmyProtocolFactory.Call(anImplementor : TObject): PmyProtocol;
begin
 Result := Self.FindPrototypeByClass(anImplementor);
 TMethod(Result.method1).Data := anImplementor;
 TMethod(Result.method2).Data := anImplementor;
end;
Идея понятна? Понятное дело, что "руками" такое написать - задача "нудная", хотя и решаемая. А вот "с модели" - запросто.

Это если "на коленке". А вот компилятор мог бы это сделать и "сильно оптимальнее".

Комментариев нет:

Отправить комментарий