泛型和实现IComparable
本文关键字:IComparable 实现 泛型 | 更新日期: 2023-09-27 18:22:02
我对泛型很陌生,我正在尝试编写一个简单的类,它将是泛型的,但也允许对字符串成员变量的一些描述进行排序。
目前我有一个基类,但当我试图实现接口成员CompareTo()时,我在顶部收到一个错误,告诉我它没有实现。这里的问题是什么?
using System;
namespace GenericsPracticeConsole.Types
{
class SortableGenericType<T> : IComparable
{
private T t;
private string stringName;
public T name
{
get { return t; }
set { t = value; }
}
public int CompareTo(SortableGenericType<T> ourObject)
{
return stringName.CompareTo(ourObject.stringName);
}
}
}
有两个接口IComparable
和IComparable<U>
。IComparable
是较早的一个(在泛型之前),它需要将实例与任意对象进行比较。IComparable<U>
需要将实例与U
的实例进行比较。如果你想声明你将在字符串名称字段上比较SortableGenericType的实例,这就是你应该做的:
class SortableGenericType<T> : IComparable<SortableGenericType<T>>
{
//
}
如果您还想实现IComparable:
class SortableGenericType<T> : IComparable, IComparable<SortableGenericType<T>>
{
private string stringName;
public T name { get; set; }
public int CompareTo(SortableGenericType<T> 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
类型的项目,并且你需要这些项目是可订购的(这不是你所要求的,但这是最常见的情况),那么你会要求T
是IComparable<T>
:
class SomeCollection<T> where T : IComparable<T>
{
private List<T> items;
private void Sort()
{
//
T item1;
T item2;
if(item1.CompareTo(item2) < 0)
{
//bla bla
}
}
}
public int CompareTo(object obj)
。注意参数类型——它是object
,而不是您自己的类型。这就是为什么您实际上没有实现接口。
您需要做的是实现IComparable<SortableGenericType<T>>