понедельник, апреля 20, 2009

Расширенная поддержка интерфейсов для Delphi

В блоге Алексея Тимохина озвучена хотелка касающаяся поддержки интерфейсов базовыми классами. На мой взгляд, идея весьма спорная, во всяком случае при нынешнем положении дел в языке. Однако, реализовать нечно подобное можно уже сейчас ;) Тут я набросал пример, как это может быть реализовано (intfExtender.pas реализует непосредственно механизм расширения, а unit1.pas содержит два примера). Если кому пригодится, буду только рад ;) Универсальность прикладного кода, о которой говорит Алексей, таким образом можно обеспечить.

p.s. Модуль сильно не тестировался, посему никаких гарантий если что ;)

8 комментариев:

Алексей Тимохин комментирует...

Ого, это же мегакруто!!!
Пример замечательно работает!

Я конечно не понимаю там большую часть, но надеюсь что это временно(хвала директиве PUREPASCAL в System.pas=)).
Спасибо огромное за такой чудесный код!

Алексей Тимохин комментирует...

В смысле, за возможность изучить такой чудесный код. =))
Там нет условий использования, поэтому непонятно, можно ли его использовать и если да, то на каких условиях?

Kazantsev Alexey комментирует...

Условия использования Public Domain. Ни каких ограничений :). Код не более чем концепт, для реального использования необходимы некоторые улучшения, например, обязательное делегирование QueryInterface от экстендера к базовому интерфейсу. Можно еще сделать, чтоб экстендеры не создавались на каждый запрос интерфейса, а использовался один экземпляр. Ну и совместимость с мультитредом можно бы обеспечить :)

Кстати, там код:
Pointer(IntfExtenderRecDynArrayPtr) := TIntfExtenderRecDynArray.Create();

Asm

MOV EAX, IntfExtenderRecDynArrayPtr
CALL System.@DynArrayAddRef

End;

можно заменить на:

IntfExtenderRecDynArrayPtr := NIL;
IntfExtenderRecDynArray := TIntfExtenderRecDynArray.Create();

Анонимный комментирует...

a a Jedi VCL не то же самое со времён этак Delphi 7 делается ля некоторых классов ? Не сравнивали ?

JvEx***.pas ?

Kazantsev Alexey комментирует...

Совсем не то же самое ;) Там обычное наследование от стандартных контролов с расширением функционала, а тут расширение функционала непосредственно самих стандартных контролов.

Safonov_A комментирует...

Привет.
А нельзя ли куда-нибудь выложить примерчик (или выслать на AMSafonov(собака)gmail.com)?
По ссылке он уже недоступен, а хотелось изучить идею. Судя по всему идея развития не получила, а жаль :(
Спасибо

Анонимный комментирует...

Линк на пример не работает. Помогите плз.

Kazantsev Alexey комментирует...

https://copy.com/TNlneJxSL8XIJJUA