Здравствуйте SDM, Вы писали:
Vi2>>Посмотри как реализуется IDispatchImpl<T> от базового интерфейса T : IDispatch. Он реализует методы базового интерфейса IDispatch. Здесь аналогия: IDispatch — это твой IBase, а T — IMyInterface.
Vi2>>Точно так же и ты можешь сделать IBaseImpl<T> с реализацией методов IBase и использовать IBaseImpl<IBase> и IBaseImpl<IMyInterface> и т.п. там, где нужно.
SDM>Но остается риторический вопрос: Получается что через наследование нельзя?
Ну почему нельзя? Можно, но муторно и не сопровождаемо.
У тебя все структуры IBase и все IMyInterface-ы определены в h-файле от MIDLа, и соотношение между ними установлены. Вклиниться туда нет возможности без потери сопровождения. Можно ввести свои классы и иерархию на них — тогда не будет связи с MIDL-овской иерархией.
Так что пусть будут шаблоны, это меньшее зло.
SDM>И еще, а как оно развернется компилятором: создаст мне N реализаций одного и того же IBaseImpl или всетаки сделает одну?
Для каждого интерфейса IMyInterface (т.е. для каждого параметра шаблона) будет свой класс IBaseImpl<IMyInterface> с реализацией функций IBase. Если функции большие и постоянные можно сделать то, что делает ATL при подобной ситуации.
Пример оттуда: IPersistStreamInitImpl<T> функция Load, IPersistStreamInit_Load и AtlIPersistStreamInit_Load с минимальными издержками.