ATL / COM: Могу ли я использовать одну и ту же функцию в двух разных интерфейсах одного и того же объекта?

Asked
Viewd126

1

У меня есть DLL на основе ATL / COM, написанная на VC ++ 6.0. До недавнего времени между моими COM-интерфейсами и классами существовало однозначное соответствие. Например, предположим, что был интерфейс ICar; затем был также класс CCar, который реализовал его, и ни один класс, кроме CCar, не реализовал ICar, а CCar не реализовал никакого интерфейса (моего), кроме ICar. Аналогично IPlane и CPlane. Определения могут быть примерно такими:

В ICar были функции «StepOnGas» и «MaxPassengers»; IPlane имел функции «LowerLandingGear» и «MaxPassengers».

Недавно я изменил его так, чтобы появился интерфейс IVehicle, у которого нет соответствующего класса CVehicle, и который реализуют как CCar, так и CPlane. Итак:

В ICar есть «СтепОнГаз»; IPlane имеет "LowerLandingGear"; У IVehicle есть «MaxPassengers». CCar использует ICar и IVehicle; CPlane поддерживает IPlane и IVehicle.

Это работает нормально, но с точки зрения клиента DLL это немного неудобно; у них есть ICar, и они хотят знать, сколько пассажиров он может вместить. Раньше они могли просто спросить; теперь они должны прыгнуть через обруч превращения его в автомобиль, прежде чем они смогут попросить об этом.

То, что я хотел бы сделать, было бы примерно следующим:

В ICar есть «StepOnGas» и «MaxPassengers»; IPlane имеет "LowerLandingGear" и "MaxPassengers"; У IVehicle есть «MaxPassengers». CCar по-прежнему поддерживает как ICar, так и IVehicle, а CPlane по-прежнему реализует как IPlane, так и IVehicle.

Я хочу, чтобы для CCar был один-единственный «MaxPassengers», и чтобы он был доступен как из ICar, так и из IVehicle; аналогично, один-единственный "MaxPassengers" для CPlane, доступный как из IPlane, так и из IVehicle.

Вызовет ли это какие-нибудь проблемы? Придется ли мне делать что-то особенное, кроме добавления «MaxPassengers» в IDL для ICar и IPlane?

В случае необходимости, клиенты этой DLL написаны как на VC ++ 6.0, так и на VB6.

Заранее благодарим за любую помощь.

1 ответов

2

Простой ответ: да, можно

Еще лучше: почему бы вам не унаследовать ICar от IVehicle, то есть вы можете расширить IVehicle новыми методами и назвать его ICar.Таким образом, ваш объект может быть QI'd для обоих интерфейсов, и ICar будет иметь все методы, необходимые клиенту для управления объектом.Это также позволяет преобразовать ICar в IVehicle, чтобы оба интерфейса могли использовать одну реализацию (т.е. доступ к MaxPassengers как в ICar, так и в IVehicle выполняется одним и тем же методом C ++).

То же самое для IPlane, но расширение будет включать другие методы.

  • О, это было бы здорово.Я не знал, что вы можете сделать это в IDL.Я постараюсь выяснить, как это сделать.

    Большое спасибо!

    Ptah- Opener of the Mouth13 ноября 2009, 21:21