Текущий архив: 2006.06.18;
Скачать: CL | DM;
ВнизПерезагрузка функции в Com Object Найти похожие ветки
← →
StealthMan (2005-07-06 13:04) [0]Есть некий Com Object с именем класса Primer и интерфейсом IPrimer.
В этом интерфейсе описаны различные функции и в частности Funct c одним входным параметром.
Через некоторое время возникла необходимость изменить количество входных параметров до двух.
Необходимо чтобы старые клиенты (1 вход парам) могли спокойно использовать новый Com наряду
с новыми (2 вход парам) при едином названии функции "Funct".
Правильное решение это "перезагрузка" функции через новый интерфейс с тем же именем функции.
Я нашел только 3 возможных решения...
(I) возможное решение - создать новый класс Primer2 и с новым интерфейсом IPrimer.
Проблема - заново описывать весь интерфейс с кучей оставшихся неизменными функциями.
(II) в классе Primer добавить новый интерфейс IPrimer2 унаследованный от IPrimer.
Проблема - 1) в название функции добавилась в конце знак "черта" Funct_
2) в описании видно реализация функции в первом интерфейсе
(необходимо скрыть при выборе второги интерфейса видимость первой реализации - как?)
(III) сначала создать класса Primer и интерфейсом IPrimer и в нем описать неизменные функции
затем создать унаследованный IPrimer2 от IPrimer со старой функцией Funct (1 параметр)
затем создать ещё унаследованный IPrimer3 от IPrimer с новой функцией Funct (2 параметр)
"+" имя функии не изменяется
"-" 1) необходимо скрыть описание интерфейса IPrimer - как?
2) если в интерфейсах IPrimer2 и IPrimer3 появятся новые неизменяемые функции
то при дальнейшей модификации Funct снова появятся проблемы при реализации I и II
(IV) ваш правильный вариант =))
Скорей всего я всё делаю и думаю неправильно =((... научите как надо?
← →
StealthMan (2005-07-06 15:02) [1]Наверное я забыл что у меня COM-сервера в виде DLL c включенной библиотекой типов.
StealthMan
(III) сначала создать класса Primer и интерфейсом IPrimer и в нем описать неизменные функции
затем создать унаследованный IPrimer2 от IPrimer со старой функцией Funct (1 параметр)
затем создать ещё унаследованный IPrimer3 от IPrimer с новой функцией Funct (2 параметр)
"-" 1) необходимо скрыть описание интерфейса IPrimer - как?
Осенило на это случай... описать родительский инерфейс руками не влючая его в библиотеку типов.
Хотя проблемы с будующим наследованием остаются...
может конечно в мастере View->Type Library нужно на функции указать какой нибудь флаг?
Кстати для чего используется такие флаги: Replaceable, Restricted, Hidden и UI Default.
← →
just_me (2005-07-06 19:00) [2]Почитайте про делегирование и агрегирование в СОМ.
ИМНО делегирование подойдет в вашем случае. Создаете Primer2 с новым интерфейсом IPrimer2. Внутри него создаете и держите объект типа Primer, реализующий IPrimer. И именно ему делегируете выполнение методов, которые не изменились. Что-то типа:
function Primer2.OldFn(...) : ...
begin
Result := oPrimer.OldFn(...);
end;
Здесь oPrimer - эта внутренняя ссылка на объект Primer
А старые клиенты пользуются Primer.
← →
StealthMan (2005-07-07 12:10) [3]Наконец я понял, что у меня видно реализацию функции в первом интерфейсе из-за того что я использую Dual-ный интерфейс. Но мне то он нужен...
just_me
Не получается тогда в наследнике использовать Dual-ный интерфейс и черта всё равно появляется.
← →
StealthMan (2005-07-07 12:34) [4]Все таки я думаю возможно сделать то что мне надо:
Ведь в DirectX от версии к версии это реализовано (меняется только название интерфейса - а название функции остается постоянным)...
← →
just_me (2005-07-07 13:29) [5]> Не получается тогда в наследнике использовать Dual-ный интерфейс
А я не говорил, что нужно наследовать интерфейс IPrimer2 от IPrimer
← →
StealthMan (2005-07-07 13:38) [6]just_me
Что то я конкретно туплю...
Пожалуйста... если тебя не затруднит, сделай по быстрому реализацию этого варианта и вышли мне на на мыло extralife собачка mail.ru
Страницы: 1 вся ветка
Текущий архив: 2006.06.18;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.011 c