具有“实现”限制的高级接口

时间:2016-03-11 22:16:34

标签: c# higher-kinded-types

我有一个特定的问题,我有一个接口IA,其方法Foo返回另一个接口IB。我希望能够有两个接口IA1(实现IA)和IB1(实现IB),并IA.Foo返回{{1 }}。我希望与其他任何实现IB1的接口(例如,某些IA)发生这种情况。

我认为唯一可能的方法是通过高阶类型,这看起来像下面的“解决方案”(这是无效的C#):

IA2

有没有办法在C#中模拟这个?

1 个答案:

答案 0 :(得分:4)

我认为你正在寻找的是协方差的概念。你可以在网上找到一些解释。我将向您介绍一些.NET文档,我认为这些文档与此问题相关,但它们本身可能不是解释协方差概念的最佳方法。

How to define an interface with a covariant type parameter

  

协变类型参数用out关键字标出(Out关键字   在Visual Basic中,+为MSIL汇编程序)。你可以使用协变   type参数作为属于的方法的返回值   接口,或作为委托的返回类型。

The out keyword on generic type parameters

  

具有协变类型参数的接口启用其方法   返回比类型指定的派生类型更多的派生类型   参数。

我已使用out关键字修改了您的代码。看一看,看看这是不是你的想法:

public interface IA<T, out M> where M : IB<T>
{
    M Foo(T val);
}

public interface IB<T>
{
    void Bar();
}

public interface IA1<T> : IA<T, IB1<T>> {}

public interface IB1<T> : IB<T>
{
    void Bar1();
}

public interface IA2<T> : IA<T, IB2<T>> {}

public interface IB2<T> : IB<T>
{
    void Bar2();
}

public void MyFunc()
{
    IA1<int> myA1 = GetMyA1();
    IB1<int> myB1 = myA1.Foo(2);
    myB1.Bar();
    myB1.Bar1();

    IA2<string> myA2 = GetMyA2();
    IB2<string> myB2 = myA2.Foo("Hello World");
    myB2.Bar();
    myB2.Bar2();
}