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

У меня есть библиотека на основе 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 имеет "StepOnGas"; IPlane имеет «LowerLandingGear»; У машины есть «Макс Пассажиры». CCar реализует ICar и IVehicle; CPlane реализует IPlane и IVehicle.

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

Итак, я хотел бы сделать следующее:

ICar имеет «StepOnGas» и «MaxPassengers»; IPlane имеет «LowerLandingGear» и «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 голосов
/ 13 ноября 2009

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

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

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

...