泛型和实现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

有两个接口IComparableIComparable<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类型的项目,并且你需要这些项目是可订购的(这不是你所要求的,但这是最常见的情况),那么你会要求TIComparable<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
         }
      }
   }
IComparable定义了方法public int CompareTo(object obj)。注意参数类型——它是object,而不是您自己的类型。这就是为什么您实际上没有实现接口。

您需要做的是实现IComparable<SortableGenericType<T>>