2015-02-05 155 views
9

比方说,我有一个如下的C#接口:为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

public interface IInterface<T> where T : SomeClass 
{ 
    void InterfaceMethod(); 
} 

,并按如下SomeClass的定义:

public class SomeClass 
{ 
    public void SomeMethod(); 
} 

现在,我想定义接口的实现,这将不编译:

public class InterfaceImpl<T> : IInterface<T> 
{ 
    public void InterfaceMethod() 
    { 
     T test = default(T); 
     test.SomeMethod(); //Gives Error 
    } 
} 

之前,我将其更改为:

public class InterfaceImpl<T> : IInterface<T> where T : SomeClass 
{ 
    public void InterfaceMethod() 
    { 
     T test = default(T); 
     test.SomeMethod(); //Compiles fine 
    } 
} 

从界面中类型约束是否也是“继承的”(不是我所知道的正确的词)是不合理的?

+1

如果没有指定,他们可能已经“默认”实现了。但实际的语法允许重新定义约束(继承,new()关键字等),这很好。 – AFract 2015-02-05 18:32:10

回答

9

该类不需要重复这些约束,它需要提供一种类型,即满足接口的约束条件。有这样做的几种方法:

  • 它可以提供满足约束条件的特定类型或
  • 它可以放置在一个通用的类型比接口所期待的其自身的限制,或
  • 它可以从接口重复约束。

关键的一点是,在TInterfaceImpl<T>属于InterfaceImpl,以便放置在任何T约束必须是InterfaceImpl自己。

+0

非常好的和明确的解释,最后一句对我来说至关重要:)知道你的答案,我唯一不明白的是为什么C#允许我创建一个不会执行你提到的任何事情的类回答?比如说,它是一些抽象类,它不调用T的方法 - 我可以在不对T进行任何约束或指定类型的情况下编译它,这将满足接口的约束。 – 2015-02-05 18:47:46

+1

@BartekEborn我不确定你的意思。在通用接口有约束的情况下,实现它的类需要提供一个兼容的参数,而不管实现类是否抽象([demo-not-compile](http://ideone.com/WG9pR1) )。我相信你的意思是别的。你能做一个演示来展示你的意思吗?你可以点击演示中的“fork”,然后根据需要进行修改。 – dasblinkenlight 2015-02-05 18:57:35

+0

这正是我的意思。我不好,我为你的努力感到抱歉。我信任Intellisense,在这种情况下没有突出显示错误(尽管它在前面已经提到过)。经过实际测试,我感到羞愧:(再次抱歉! – 2015-02-05 19:04:36