Проблема разработки интерфейса - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть дизайн, похожий на этот пример:

interface IFoo<T1>
{
    IBar<T1> Bar { get; }
}

interface IFoo<T1, T2> : IFoo<T1>
{
    new IBar<T1, T2> Bar { get; }
}

class Foo<T1> : IFoo<T1>
{
    public IBar<T1> Bar { get; private set; }

    public Foo(IBar<T1> bar)
    {
        Bar = bar;
    }
}

class Foo<T1, T2> : Foo<T1>, IFoo<T1, T2>
{
    public Foo(IBar<T1, T2> bar) : base(bar) { }

    public new IBar<T1, T2> Bar { get{return base.Bar as IBar<T1, T2>;} }
}

interface IBar<T1>...

class Bar<T1> : IBar<T1>...

interface IBar<T1, T2> : IBar<T1>...

class Bar<T1, T2> : Bar<T1>, IBar<T1, T2>...

Который затем можно использовать так:

        var bar = new Bar<int, int>();
        var foo = new Foo<int, int>(bar);

или вот так:

        var bar = new Bar<int>();
        var foo = new Foo<int>(bar);

или даже:

        var bar = new Bar<int, int>();
        var foo = new Foo<int>(bar);

Единственная неработающая комбинация - передача наименьшего производного бара в наиболее производное foo.

        var bar = new Bar<int>();
        var foo = new Foo<int, int>(bar); //does not work

Существует бросок барапри вызове базового конструктора и единицы при доступе к свойству в производном классе, но это просто доступ к одному и тому же объекту через два разных интерфейса, которые он поддерживает.

На самом деле я считаю эту конструкцию довольно аккуратной и эффективной.Это также довольно безопасно: приведение не удастся, если вы попытаетесь испортить параметры.

Видите ли вы какие-либо недостатки в этом проекте, и если да, то как его можно улучшить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...