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

Вниз

COM и иерархия ООП   Найти похожие ветки 

 
Darvin ©   (2008-10-16 14:50) [0]

Здравствуйте!
Есть вопрос по технологии рефакторинга приложения. Есть приложение, состоящее из некоего ядра и подключаемых плагинов. Плагины реализованы в виде bpl. В ядре находится декларация и реализация некоторых базовых классов плагинов, их может быть достаточно ветвистая иерархия (базовых классов). Каждый плагин является наследником одного из базовых классов.
Появилось желание реализовать плагины с использованием технологии com. Возник вопрос.В технологии com плагин (сервер com) является независимой единицей. Как "подружить" наследование плагинов от базовых классов и независимость каждого плагина, как сервера com? Может ли com объект использовать иерархию, описанную в другом com объекте, если может, то как?


 
Сергей М. ©   (2008-10-16 15:01) [1]


> В ядре находится .. реализация некоторых базовых
> классов плагинов


Это как это ?


 
Darvin ©   (2008-10-16 15:06) [2]

> Сергей М. ©   (16.10.08 15:01) [1]
В модулях ядра описаны базовые классы плагинов. Плагины (bpl) подключают ядро как required и в своих модулях используют модули ядра. Сами при этом реализуют классы плагинов - наследников базовых классов.


 
Сергей М. ©   (2008-10-16 15:14) [3]


> Darvin ©   (16.10.08 15:06) [2]


Ничего не понятно ..

Что ты называешь "ядром" - некую bpl или что ?


 
Darvin ©   (2008-10-16 15:16) [4]

>Сергей М. ©   (16.10.08 15:14) [3]
да


 
Сергей М. ©   (2008-10-16 15:23) [5]


> Darvin ©   (16.10.08 15:16) [4]


Ну так к приложению-то эта bpl отношения не имеет, приложение - это exe ..


 
clickmaker ©   (2008-10-16 15:26) [6]

> Может ли com объект использовать иерархию, описанную в другом
> com объекте, если может, то как?

сплошь и рядом использует
все интерфейсы - наследники IUnknown, а многие - IDispatch


 
Сергей М. ©   (2008-10-16 15:29) [7]


> Darvin


Если ты обратил взор на COM-технологию, то о технологии пакетов можно смело забыть


 
jack128_   (2008-10-16 15:30) [8]

либо вкомпилируй всю иерархию объектов в плагин, либо нарисуй паралельную иерархию интерфейсов, а плагин будет реализацию базовых интефейсов делегировать ядру, а дополнительные и перекрытые методы реализовыывать сам.


 
Darvin ©   (2008-10-16 15:31) [9]

>jack128_   (16.10.08 15:30) [8]
>а плагин будет реализацию базовых интефейсов делегировать ядру
С этого момента можно подробнее? Как это "делегировать"?


 
Darvin ©   (2008-10-16 15:33) [10]

>Сергей М. ©   (16.10.08 15:29) [7]
>Если ты обратил взор на COM-технологию, то о технологии пакетов можно >смело забыть
100%.
Вопрос в том, где делать реализацию базовых классов.


 
tesseract ©   (2008-10-16 15:36) [11]


> Может ли com объект использовать иерархию, описанную в другом
> com объекте, если может, то как?


А почему нет ? Не совсем понял - тебе COM-объект потомок другого создать ?  Это в принципе  и так есть. С интерфейсами ешё проще Или что-бы без рекомпиляции можно было подцеплять иерархию ?


 
Сергей М. ©   (2008-10-16 15:38) [12]


> Вопрос в том, где делать реализацию базовых классов


В том самом "ядре" и делать.
С этой т.з. ничего не изменилось.

Только теперь хост-приложение обращается к плагину не как к пакету, а как к независимому COM-объекту, запрашивая у него тот или иной интерфейс, включая интерфейс базового класса.


 
Darvin ©   (2008-10-16 15:40) [13]

>tesseract ©   (16.10.08 15:36) [11]
В com объекте описать наследника некоторого класса, реализованного вне com объекта, например в другом com-объекте


 
Darvin ©   (2008-10-16 15:43) [14]

>Сергей М. ©   (16.10.08 15:38) [12]
А как com-объект узнает о базовом интерфейсе, реализованном в com-приложении. И как создать com-объект, часть которого реализована в хост приложении?


 
tesseract ©   (2008-10-16 15:48) [15]


> А как com-объект узнает о базовом интерфейсе, реализованном
> в com-приложении.


Через TLB куда хочешь и как хочешь передавай данные, например передавай в COM ссылку на COM "ядра" или базового класса и не парься. В OLE можно хоть динамически имена методов задавать, если конечно IDispatch знать хорошо. Вообще в COM иногда совершенно непонятно, кто тут сервер, а кто клиент.


 
Сергей М. ©   (2008-10-16 15:54) [16]


> как com-объект узнает о базовом интерфейсе, реализованном
> в com-приложении


В каком-таком COM-приложении ?

Приложение у тебя обычное, несмотря на то что оно является COM-контроллером, т.е. подключается к COM-серверам (реализованным в твоих плагин-модулях) и управляет ими.


> как создать com-объект, часть которого реализована в хост
> приложении?


Ты же только что сказал, что та самая "часть", называемая тобой "ядром", реализована в bpl, а не exe ? Ну так а причем здесь хост-приложение ?
Хост-приложение знать ничего не знает о "ядре", оно обращается к плагину (неважно каким образом), который представляет интересующий интерфейс, включая базовый. А уж где физически находится реализация методов базового интерфейса - то ли в модуле самого плагина, то ли в модуле некоей "ядерной" bpl - это хост-приложению совершенно по барабану.


 
jack128_   (2008-10-16 15:56) [17]


> Как это "делегировать"?

Ну вот полная имитация иерархии объектов на интерфейсах

в ядре

IParent = interface
 procedure StaticMethod;
 procedure VirtualMethod;
end

TParent = class(TInterfacedObject, IParent)
public
 procedure StaticMethod;
 procedure VirtualMethod;
end;


в плагине:

IChild = interface(IParent)
 procedure ChildMethod;
end;

TChild = class(TInterfacedObject, IParent, IChild)
private
 FParent: IParent;
protected
 procedure VirtualMethod; // перекрываем виртуальный метод
 procedure childMethod; // добовляем новый метод
public
 constructor Create;
 property Parent: IParent read FParent implements IParent; // остальные методы наследуем от родителя из ядра
end;

constructor TChild.Create;
begin
 FChild := Core.CreateParent();
end;


 
jack128_   (2008-10-16 15:58) [18]


> constructor TChild.Create;
> begin
>  FParent := Core.CreateParent();
> end;


 
Darvin ©   (2008-10-16 16:14) [19]

>jack128_   (16.10.08 15:56) [17]
Спасибо большое за пример. Вопрос, а откуда я в плагине знаю о IParent, я ведь не могу делать uses uCore. Я должен IParent также описать и в плагине?


 
jack128_   (2008-10-16 16:16) [20]


> Я должен IParent также описать и в плагине?

да, конечно.

делаешь отдельный юнит:

unit Core.Intfs;

type
 IParent = interface
   procedure StaticMethod;
   procedure VirtualMethod;
 end

implemintation

end.


и вкомпилируешь его и в ядро и в плагин.


 
Darvin ©   (2008-10-16 16:19) [21]

>Jack128_   (16.10.08 16:16) [20]
Супер. А в выражении Core.Create, Core - это что?


 
tesseract ©   (2008-10-16 16:26) [22]


> А в выражении Core.Create, Core - это что?


Слушай почитай уже про COM. Или через визарда создай. Многие вопросы отпадут.


 
Darvin ©   (2008-10-16 17:07) [23]

ок, спасибо большое



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.051 c
15-1224237256
balepa
2008-10-17 13:54
2008.12.21
BPascal


4-1202586871
AntiDot
2008-02-09 22:54
2008.12.21
контрол, для отображения карты диска


15-1224154710
Кто б сомневался
2008-10-16 14:58
2008.12.21
Почему у многих девушек нет подруг?


15-1223285577
Kerk
2008-10-06 13:32
2008.12.21
Письмо в кремль 2


15-1224123146
Slider007
2008-10-16 06:12
2008.12.21
С днем рождения ! 16 октября 2008 четверг





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский