我在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接口。
我不太了解它。 我从未使用的第一个例子和我经常使用的第二个例子(这是界面的经典例子)。一些建议 - 补充剂?
如何在实践中应用?
答案 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,导致你的皱眉。