[泛型]-泛型接口IComparable

系统提供了许多泛型类和泛型接口,List<T>和Dictionary<K,V>是常用的泛型类。IComparable<T>是最常用的泛型接口。泛型接口具有一般接口的共同特点,即在接口中可以包含字段,属性,方法和索引器,但都不能实现。

IComparable和IComparer接口区别如下:
◆IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象;
◆IComparer在一个单独的类中实现,可以比较任意两个对象。

IComparable接口规定了一个没有实现的方法CompareTo(Object obj),语法如下:
public interface IComparable
{
int CompareTo(Object ojb);
}

此接口的方法CompareTo用于比较对象大小,如果一个类实现了这个接口中的该方法,说明这个类的对象是可以比较大小的。
int CompareTo(Object obj)方法返回一个整型值,其含义下:

如果当前对象小于obj,则返回值小于0。
如果当前对象小于obj,则返回值大于0。
如果当前对象小于obj,则返回值等于0。

IComparable接口接受的参数类型为Object,因此需要对CompareTo()函数的参数进行运行时类型校验。每一次执行比较时,都要重新解析参数的类型。

using System;
using System.Collections.Generic;
public class Student: IComparable
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private int age;
public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
public Student(string sname, int sage)
{
this.name = sname;
this.age = sage;
}
//实现接口中的方法
public int CompareTo(object obj)
{
//将参数转化为Student对象
Student other = obj as Student;
//比较大小,返回结果
return this.age.CompareTo(other.age);
}
}

class Progarm
{
static void Main()
{
Student stu1 = new Student("张三", 10);
Student stu2= new Student("李四", 20);
Student stu3 = new Student("王五", 30);
//对象之间进行比较
if (stu1.CompareTo(stu2) > 0)
Console.WriteLine("{0}的年龄大于{1}", stu1.Name, stu2.Name);
else
Console.WriteLine("{0}的年龄小于{1}", stu1.Name, stu2.Name);
}
}

注意:参数obj必须与实现该接口的类有相同的类型,否则会引发异常。

Student other = obj as Student;

使用as关键字将obj转换为实现接口的Student类的对象。

说明:as属于运算符,用于在兼容的引用类型之间执行类型转换,类似于强制转换,只是强制转换失败时会引发异常,而as运算符将返回空值,不会引发异常。

泛型接口IComparable<T>就是接口Icomparable的泛型版本,和前面的泛型一样,此泛型接口对类型有严格的约束,不需要类型转换。

IComparable<T>泛型接口仅包含一个方法,语法如下:

public interface Icomparable<T>
{
int CompareTo(T t)
}

其中,“<T>”和List<T>中的T有相同的含义,代表任意类型,CompareTo方法中的参数t代表该数据类型的对象。

把上面的代码改写一下:
public class Student: IComparable
换成
public class Student: IComparable<Student>

同时实现接口的代码改为:
//实现接口中的方法
public int CompareTo(Student other)
{
//比较大小,返回结果
return this.age.CompareTo(other.age);
}

其他代码不需要修改,运行结果和上面代码相同。

你可能感兴趣的:(comparable)