Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.041 c
2-1148732237
VANAP
2006-05-27 16:17
2006.06.18
Сохранение в Paradox и фильтр


8-1137193431
rd
2006-01-14 02:03
2006.06.18
disparity map


15-1148722099
Petr V. Abramov
2006-05-27 13:28
2006.06.18
ipnat.sys


15-1148368995
Polevi
2006-05-23 11:23
2006.06.18
решил вот помочь


1-1147103040
Андрей Молчанов
2006-05-08 19:44
2006.06.18
Управление тултипами TTreeView