接口继承和泛型约束之间的区别

时间:2012-03-24 14:42:06

标签: c#

我在C#中有以下代码

1)

public class MyBinaryTree<TItem> where TItem : IComparable<TItem>
{ ... };

2)

public class MyBinaryTree<TItem> : IComparable<TItem>
{ ... };

I found this sample at this site,但它完全不是我想要的

第一个示例/代码告诉我们 item(TItem)实现了IComparable接口

第二个示例/代码告诉我们整个类(MyBinaryTree)实现了IComparable接口

我不太了解它。 我从未使用的第一个例子和我经常使用的第二个例子(这是界面的经典例子)。一些建议 - 补充剂?

如何在实践中应用

2 个答案:

答案 0 :(得分:5)

不同之处在于第二个例子是接口继承。第二个是关于泛型类型的constraints

接口继承意味着继承该接口的类必须提供接口中包含的方法的实现(除非它是抽象的)。因此,这基本上对类及其构建方式施加了约束

另一方面,约束对类中使用的泛型类型施加约束。这使得实现能够对TItem在类中允许做什么做出某些假设。

示例:

<强>继承

public class IComparableImplemented : IComparable<T>
{
   //MUST implement CompareTo
   public int CompareTo(T other)
   {
       //Compare stuff
   }
}

类型约束

public class ClassUsingConstraints<T> where T : IComparable<T>
{
   public static void method(T stuff)
   {
       stuff.CompareTo(stuff);  
   }
}

因此,您会注意到继承强制该类实现方法。而类型约束不会对类实现强制执行任何操作。相反,类型约束迫使T必须实施IComparable 。因此,您可以依靠T访问CompareTo方法

答案 1 :(得分:0)

这些陈述并不具有可比性!双关语打算

正如您所说的是经典实现,另一个是说MyBinaryTree集合中的有效条目,该成员必须实现该接口。

public class MyBinaryTree<TItem> where TItem : IComparable<TItem>

可能很容易

public class MyBinaryTree<TItem> where TItem : int;
{
}

它只选择在两个语句中使用IComparable,导致你的皱眉。