在C#中创建通用接口

时间:2011-11-15 15:58:53

标签: c# .net generics c#-4.0

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

在类AFirst中实现时,它应该有一个返回类型A的方法MyMethod<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>();

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

我试过了:

interface IMyInterface<T> where T : A
{
    T GetNewInstance<T>();
}

我尝试以这种方式实现,但是当我点击工具时,我就像这样创建了它:

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

对我来说没有意义,因为我已经将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();
    }
}

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

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

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

2 个答案:

答案 0 :(得分:9)

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

interface IMyInterface<T> where T : A
{
    T GetNewInstance();
}

这将实现为

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

我猜是你想要的。

答案 1 :(得分:1)

你可能过于复杂了。你可以考虑Template pattern。基类是抽象的,并定义了一个可覆盖的方法。继承自此基类的类然后提供此方法的实现。

您仍然可以使用泛型和界面,但这种模式可能是您需要开始的基础。

修改

public abstract class ABase<T>
{
    public abstract T MyMethod();
}

public class A : ABase<A>
{
    public override A MyMethod()
    {
        throw new NotImplementedException();
    }
}

public class B : A
{
}

要实现一个接口,这将是

public interface IHasMethod<T>
{
    T MyMethod();
}

public abstract class ABase<T> : IHasMethod<T> ...