У вас есть пример того, как кто-то на самом деле это делает? Хотя в COM вполне законно иметь одно и то же имя для метода в интерфейсе и в другом производном от него интерфейсе, это делает работу с производным интерфейсом сложной или невозможной практически во всех средах разработки. Это включает в себя реализацию, а также вызов любых COM-объектов на основе интерфейса.
Нет такой вещи, как переопределение или скрытие в интерфейсе COM. Интерфейс COM - это просто контракт на то, как двоичный интерфейс объекта будет размещен в памяти, имена методов в определении интерфейса не имеют смысла, за исключением инструментов. В вашем случае BaseComInterface обещает «vtable» с шестью методами, первые три соответствуют сигнатурам методов IUnknown, а следующие три соответствуют сигнатурам трех методов, которые вы дали, все в правильном порядке. С другой стороны, DerivedComInterface обещает «vtable», который включает девять методов, опять же первые три сигнатуры соответствуют методам IUnknown, следующие три соответствуют сигнатурам методов BaseComInterface, а последние три соответствуют трем методам, уникальным для DerivedComInterface. Имена этих методов не имеют значения, за исключением вашей IDE, инструментов и компилятора, которым требуются имена для поиска указателей 'vtable'.
Таким образом, в основном в C #, а также в C, C ++ и некоторых других языках для реализации DerivedComInterface одно из имен методов должно быть декорировано, чтобы отличить его слот «vtable» от другого.
Чтобы ответить на ваш вопрос - вы не удалите ни один из методов, поскольку они оба должны быть там, чтобы выполнить контракт COM:
[Guid("fab51c92-95c3-4468-b317-7de4d7588254"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDerivedComInterface
{
void method1();
void method2();
void method3();
void method1_2(); //Decorated to distinguish from base interface method.
void method4();
void method5();
}
Это игнорирует то, что произойдет, если эти интерфейсы будут производиться от IDispatch, а не от IUnknown, - беспорядок, в который я бы не хотел попасть. Кроме того, помните, что если ваш idl действительно определяет методы как возвращающие void, вы должны декорировать ваши методы C # атрибутом PreserveSig.