Форум: "Прочее";
Текущий архив: 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