在C#中创建通用接口

Can*_*ğlu 3 .net c# generics c#-4.0

我知道标题可能令人困惑(甚至误导),但我打算创建一个通用的接口,它应该实现一个涉及泛型参数的方法.

当在类中实现时AFirst,它应该有一个MyMethod<A>()返回类型A 的方法,并且当在类中实现时BFirst,它应该有一个MyMethod<B>()返回类型B 的方法.我需要这个功能,因为A和B之间存在继承关系(和其他许多人一样) )我需要一个可以用任何基类调用的泛型方法.

如果它令人困惑,看看我想做什么:

考虑B派生自A.考虑AFirst和BFirst 分别实现IMyInterface<A>IMyInterface<B>:

BFirst mySecondObj = new BFirst();
A myA = BFirst.MyMethod<A>();
B myB = BFirst.MyMethod<B>();
Run Code Online (Sandbox Code Playgroud)

我需要访问MyMethod基类的模板,因此当我实例化BFirst实例时,我可以调用MyMethodfor AB.我正在构建一个模板系统并考虑这些AFirst并且BFirst是模板,并且MyMethod就像工厂方法一样.我将有一个很大的层次结构,项目需要通过从我的基类派生更多的类来扩展A,所以我不能只为每个类创建单独的接口或方法.

我试过这个:

interface IMyInterface<T> where T : A
{
    T GetNewInstance<T>();
}
Run Code Online (Sandbox Code Playgroud)

我尝试以这种方式实现,但是当我点击工具时,我正在按照这样的方式创建它:

class AFirst : IMyInterface<A>
{
    public T GetNewInstance<T>()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

以我指定T类型的方式对我没有意义A,但它仍然实现为T.例如,它会像这样(下面是我希望它发生的方式)

class AFirst : IMyInterface<A>
{
    public A GetNewInstance<A>()
    {
        throw new NotImplementedException();
    }
}

class BFirst : AFirst, IMyInterface<B>
{
    public B GetNewInstance<B>()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

从外部代码中,在我的问题开头调用示例:

BFirst myBFirst = new BFirst();
A a = BFirst.GetNewInstance<A>(); //calls AFirst's method and returns A
B b = BFirst.GetNewInstance<B>(); //calls BFirst's method and returns B
Run Code Online (Sandbox Code Playgroud)

这怎么可能?谢谢,可以.

Tim*_*ers 9

在通用接口中,您可以定义通用方法.我认为这就是混乱的地方.它应该是返回泛型类型的常规方法.即

interface IMyInterface<T> where T : A
{
    T GetNewInstance();
}
Run Code Online (Sandbox Code Playgroud)

这将实现为

class AFirst : IMyInterface<A>
{
    public A GetNewInstance()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜是你想要的.