gpt4 book ai didi

c# - 具有 "implements"限制的高级接口(interface)

转载 作者:行者123 更新时间:2023-11-30 20:37:31 25 4
gpt4 key购买 nike

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

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

public interface IA<M> where M<> : IB<>
{
M<T> Foo1<T>(T val);
M<T> Foo2<T>();
}

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

public interface IA1 : IA<IB1> {}

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

public interface IA2 : IA<IB2> {}

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

public void MyFunc()
{
IA1 myA1 = GetMyA1();
IB1<int> myB1Int = myA1.Foo1<int>(2);
int myB1IntBar = myB1Int.Bar();
myB1Int.Bar1();
IB1<string> myB1String = myA1.Foo2<string>();
string myB1StringBar = myB1String.Bar();

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

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

最佳答案

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

How to define an interface with a covariant type parameter

A covariant type parameter is marked with the out keyword (Out keyword in Visual Basic, + for the MSIL Assembler). You can use a covariant type parameter as the return value of a method that belongs to an interface, or as the return type of a delegate.

The out keyword on generic type parameters

An interface that has a covariant type parameter enables its methods to return more derived types than those specified by the type parameter.

我已经使用 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();
}

关于c# - 具有 "implements"限制的高级接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35950945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com