Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

Перезагрузка функции в 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 вся ветка

Форум: "Corba";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
2-1149080044
Серге И
2006-05-31 16:54
2006.06.18
Приветствую вас гении программирования!!! Меня интересует темпера


2-1148988920
Steep
2006-05-30 15:35
2006.06.18
Цвет точки


15-1148294900
Имя не скажу
2006-05-22 14:48
2006.06.18
Маленький тренажер для мозга :))


1-1147319024
dwar
2006-05-11 07:43
2006.06.18
Работа с XML через MSXML_TLB


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский