Есть ли способ сохранить наследование классов в C# и в то же время соблюдать правила наследования интерфейса COM-взаимодействия? Или, с другой стороны, как можно дублировать функциональность AutoDual с явными интерфейсами?
Я получил библиотеку API, написанную на C#, от другой компании, которая использует Microsoft.Runtime.InteropServices. Я использую его для компиляции в DLL, которую наше устаревшее программное обеспечение (в powerbuilder) использует для вызова API. Я пытаюсь использовать ClassInterfaceType.None
, чтобы избежать ClassInterfaceType.AutoDual
, что может нарушить функциональность в будущем. Я столкнулся со следующей проблемой:
Компания, написавшая библиотеку API, использовала хороший объектно-ориентированный дизайн. Хотя это снижает избыточность кода C#, это работает против моих целей, поскольку структура наследования классов противоречит требованиям COM-интерфейса. Например. методы Get для каждого запроса (их много) вызывают один и тот же метод, который ожидает унаследованный универсальный тип:
Общий метод:
private T Get<T>(string Foo, string Bar) where T : UmbrellaResponse, new() { /* get the response*/ }
Два из многих конкретных методов:
namespace SeparateFromTheObjects
{
public SpecificResponse1 GetSpecificResponse1(string token)
{
return Get<SpecificResponse1>(token, "specific_thing");
}
public SpecificResponse2 GetSpecificResponse2(string token)
{
return Get<SpecificResponse2>(token, "specific_thing");
}
}
Который в настоящее время наследуется следующим образом: public class SpecificResponse : UmbrellaResponse
Поэтому, если я создам интерфейс со всеми необходимыми свойствами/методами и изменю его на SpecificResponse : ISpecificResponse
или даже : IUmbrellaResponse
, все методы нельзя будет использовать, потому что они больше не наследуются от CLASS UmbrellaResponse.
В принципе, есть ли способ сохранить наследование классов в C# и в то же время соблюдать правила наследования интерфейса COM-взаимодействия? Или, с другой стороны, как можно дублировать функциональность AutoDual с явными интерфейсами?
Если это невозможно, как вы можете написать методы (такие как метод get выше) для размещения нескольких объектов, которые не наследуются от одного и того же типа?
Я прочитал следующее, но не думаю, что он содержит ответ: Почему я не должен использовать АвтоДвойной?