首页 > 解决方案 > 接口继承设计问题

问题描述

我有一个类似于这个例子的设计:

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);

唯一不起作用的组合是将派生最少的 bar 传递给派生最多的 foo。

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

调用基本构造函数时有一个 bar 类型转换,而在访问派生类中的属性时有一个类型转换,但这只是通过它都支持的两个不同接口访问同一个对象。

我实际上发现这个结构非常整洁和高效。这也是相当安全的:如果你试图弄乱参数,强制转换将会失败。

您是否发现此设计有任何缺陷,如果有,如何改进?

标签: c#genericsinheritanceinterface

解决方案


推荐阅读