generics和实现IComparable
我对generics非常新,我正在尝试编写一个简单的类,它将是通用的,但也允许对字符串成员变量进行一些描述的排序。
目前我有一个基本的类,但是当我尝试实现接口成员CompareTo()时,我在顶部收到一个错误,告诉我它没有实现。 这是什么问题?
using System; namespace GenericsPracticeConsole.Types { class SortableGenericType : IComparable { private T t; private string stringName; public T name { get { return t; } set { t = value; } } public int CompareTo(SortableGenericType ourObject) { return stringName.CompareTo(ourObject.stringName); } } }
有两个接口IComparable
和IComparable
。 IComparable
是较旧的(在generics之前),需要将实例与任意对象进行比较。 IComparable
要求将实例与U
实例进行比较。 如果您要声明将比较stringName字段上的SortableGenericType实例,那么您应该这样做:
class SortableGenericType : IComparable> { // }
如果您还想实现IComparable:
class SortableGenericType : IComparable, IComparable> { private string stringName; public T name { get; set; } public int CompareTo(SortableGenericType ourObject) { //I forgot to add this statement: if(ourObject == null) return -1; return stringName.CompareTo(ourObject.stringName); } public int CompareTo(object obj) { if (obj.GetType() != GetType()) return -1; return CompareTo(obj as SortableGenericType ); } }
如果你的类是一个集合,它将保存类型为T
项目,你需要这些项目是可订购的(这不是你要求的,但这是最常见的情况),而不是你要求T
为IComparable
:
class SomeCollection where T : IComparable { private List items; private void Sort() { // T item1; T item2; if(item1.CompareTo(item2) < 0) { //bla bla } } }
IComparable定义了public int CompareTo(object obj)
。 注意参数类型 – 它的object
,而不是您自己的类型。 这就是你实际上没有实现界面的原因。
您需要做的是实现IComparable