[英]IComparable doesn't need to be contravariant?
在下面的代碼中,我的目標是.NET 2.0 Framework。
我可以將一個Programmer(派生)對象傳遞給需要Person(基類)的Compare方法
但是,由於程序員是一個人(簡單的OO概念),我聲稱在.NET 4.0中,IComparable接口聲明中的'in'關鍵字是'矯枉過正':)
在我給微軟寫一封關於他們刪除in關鍵字的電子郵件之前請嘗試說服我:)
class Program
{
static void Main(string[] args)
{
var person = new Person();
var test = person.CompareTo(new Programmer());
}
}
internal class Person : IComparable<Person>
{
public int Id { get; set; }
public string Name { get; set; }
public int CompareTo(Person other)
{
return this.Id - other.Id;
}
}
class Programmer : Person
{
public string ProgrammingLanguage { get; set; }
}
共同和逆變不是關於你傳遞給方法的類型。 它是關於包含方法的通用接口。
in
以下代碼中是合法的:
IComparable<Person> foo = ...;
IComparable<Programmer> bar = foo;
如果沒有in
這將是非法的。
通過Liskov替換原則 ,如果IComparer<>
實現可以比較Person
實例,那么它可以比較從Person
派生的類型的對象。 in
關鍵字允許您使用IComparer<Person>
MyPerson
來比較MyPerson
類型的MyPerson
(派生自Person
)。 示例用例是一個比較器,它按名稱對Person
實例進行排序,以便在SortedList<Person>
; 逆變接口也允許相同的比較器與SortedList<MyPerson>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.