У меня есть вопрос, который не является проблемой прямого кодирования, поэтому я не уверен, что это место, где можно задать вопрос. Если нет, пожалуйста, сообщите, где лучше спросить.
У меня есть сборка. Net, открытая для COM. Он использует базовый класс и несколько производных классов, все представленные через интерфейсы.
Базовый класс:
public abstract class BaseFoo : IBaseFoo
{
public abstract int X { get; }
public abstract int Y { get; }
}
с интерфейсом:
public interface IBaseFoo
{
int X { get; }
int Y { get; }
}
Производные классы являются COM- видны и добавляют дополнительный функционал.
[ComVisible(true)]
[Guid("123-456-789")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IFooA))]
public class FooA : BaseFoo, IFooA
{
public override int X { get; }
public override int Y { get; }
public string Z { get; set; }
}
Интерфейс открыт для COM:
[ComVisible(true)]
[Guid("321-654-987")]
public interface IFooA : IBaseFoo
{
string Z { get; set; }
}
На этом этапе люди, работавшие с COM, заметят проблему. IFooA
будет открыт для COM, но он не будет предоставлять ничего из IBaseFoo
, потому что унаследованные интерфейсы не делают его для COM.
Чтобы преодолеть это, я сделал следующее:
[ComVisible(true)]
[Guid("321-654-987")]
public interface IFooA : IBaseFoo
{
new int X { get; }
new int Y { get; }
public string Z { get; set; }
}
Что, наконец, подводит меня к моему вопросу: мне там не нравится new
. Это неправильно, переопределяя унаследованный интерфейс. Было бы лучше создать отдельный интерфейс IComFooA
, иметь наследование FooA
и предоставить этот интерфейс для COM, очистка IFooA
, чтобы он был просто. Net? По сути: вы бы посоветовали схему, описанную выше или схему ниже, и почему?
[ComVisible(true)]
[Guid("123-456-789")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IComFooA))]
public class FooA : BaseFoo, IFooA, IComFooA
{
public override int X { get; }
public override int Y { get; }
public string Z { get; set; }
}
с IComFooA
:
[ComVisible(true)]
[Guid("321-654-987")]
public interface IComFooA
{
int X { get; }
int Y { get; }
public string Z { get; set; }
}
И IFooA
- просто:
public interface IFooA : IBaseFoo
{
public string Z { get; set; }
}