Предыдущая "скажем серия" тут - 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;Идея понятна? Понятное дело, что "руками" такое написать - задача "нудная", хотя и решаемая. А вот "с модели" - запросто.
Это если "на коленке". А вот компилятор мог бы это сделать и "сильно оптимальнее".
Комментариев нет:
Отправить комментарий