使用'generic'方法创建一个接口,但它的泛型类型是接口的实现者

时间:2015-01-29 19:11:59

标签: c# generics interface

C#中是否有任何方法可以使用通用类型,该类型始终是接口中的实现类型?像这样:

interface Foo
{
    this GetOtherThis();
}

class Bar : Foo
{
    Bar GetOtherThis();
}

2 个答案:

答案 0 :(得分:5)

  

C#中是否有任何方法可以使用通用类型,该类型始终是接口中的实现类型?

没有。到目前为止给出的答案满足了这个要求,原因有两个:

  • 您始终可以使用不同的T

    实现接口
    interface IFoo<T>
    {
        T GetOtherThis();
    }
    
    public class NotAString : Foo<string>
    {
        string GetOtherThis() { ... }
    }
    

    这可以通过约束来修复某处interface IFoo<T> where T : IFoo<T>但是仍然没有停止;

    public class Good : IFoo<Good> { ... }
    
    public class Evil : IFoo<Good> { /* Mwahahahaha */ }
    
  • 无论如何继承都会破坏它:

    interface IFoo<T>
    {
        T GetOtherThis();
    }
    
    public class WellBehaved : IFoo<WellBehaved>
    {
        WellBehaved GetOtherThis() { ... }
    }
    
    public class BadlyBehaved : WellBehaved
    {
        // Ha! Now x.GetOtherThis().GetType() != x.GetType()
    }
    

基本上C#中没有任何内容可以为您强制执行此操作。如果您认为接口实现是合理的,那么通用接口方案仍然有用,但您需要了解其局限性。

答案 1 :(得分:2)

是的,您可以使用通用接口编写代码:

interface Foo<T>
{
    T GetOtherThis();
}

class Bar : Foo<Bar>
{
    Bar GetOtherThis();
}

注意:您可以在T上放置通用约束,以使T成为实施类。 Jon Skeet更详细地解释了它。