接口继承和泛型约束之间的区别
本文关键字:之间 区别 约束 泛型 继承 接口 | 更新日期: 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才会导致你眉头紧锁。