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

本文关键字:之间 区别 约束 泛型 继承 接口 | 更新日期: 2023-09-27 18:28:49

我在C#中有以下代码

1)

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

2)

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

我在这个网站上找到了这个样本,但它并不是我想要的完全方式。

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

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

我不是很理解。第一个示例我从未使用过,第二个示例我经常使用(这是接口的经典示例)。一些建议-补充?

它是如何在实践中应用的?

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

区别在于第二个例子是接口继承。第二个是对泛型类型的限制

接口继承意味着继承该接口的类必须提供接口中包含的方法的实现(除非是抽象的)。因此,这本质上对类以及如何构建施加了限制

另一方面,约束对类中使用的泛型类型施加约束。这使得实现能够对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方法

这些语句实际上不可比较!Pun预期

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

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

可能很容易成为

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

只有在两种陈述中都选择使用IComparable才会导致你眉头紧锁。