Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
2-1226161946
Надуев Алексей
2008-11-08 19:32
2008.12.21
WebBrowser


2-1226277502
ЛамерЪХ
2008-11-10 03:38
2008.12.21
Поиск всех главных окон


15-1224133910
Vlad Oshin
2008-10-16 09:11
2008.12.21
Москва. Ищу жилье. Любое. Прошу не удалять.


2-1226482700
Сергей
2008-11-12 12:38
2008.12.21
Поле мемо заполняется только до середины.


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