Главная страница
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.055 c
15-1148814407
Strate
2006-05-28 15:06
2006.06.18
Функция Max() в MS Access


2-1148835732
Fiallo4ka
2006-05-28 21:02
2006.06.18
Базы данных в Delphi


15-1148563350
Pger
2006-05-25 17:22
2006.06.18
Работа через прокси


15-1148499456
Nic
2006-05-24 23:37
2006.06.18
Кто-нибудь делал электронные книги в Math Cad e?


2-1149001787
Махоня
2006-05-30 19:09
2006.06.18
как связать Word c Delphi