наследование интерфейсов и передовой опыт COM-взаимодействия? - PullRequest
0 голосов
/ 26 января 2020

У меня есть вопрос, который не является проблемой прямого кодирования, поэтому я не уверен, что это место, где можно задать вопрос. Если нет, пожалуйста, сообщите, где лучше спросить.

У меня есть сборка. 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...