假設有這樣乙個類:
class但是由於我們知道是返回乙個person類的例項,所以返回型別 object 寫在這裡總會覺得很彆扭,我們希望寫成:person : icloneable
}
class顯然,這是錯的!雖然這是錯的,但這就是返回型別的協變性,只是非泛型介面和方法過載不支援這一特性.如果一定要這樣寫,只能使用顯示介面實現:person : icloneable
}
class如果定義的是 icloneable型別, 則呼叫上面的方法;person : icloneable
public
person clone()
}
如果定義的是 person 型別,則呼叫下面的方法;
假設我們有這樣乙個類:
class我們想在派生類中寫如下乙個方法:person
}
class看起來很合理, 因為 object 是基類,肯定可以接受 person 類的例項呀,這稱為引數型別的逆變性但實際上,和協變一樣,非泛型介面介面和方法不支援乙個返回值為 基類 的委託變數,可以接收乙個返回值為 派生類 的委託例項student : person
}
class乙個引數為 派生類 的委託變數, 可以接收乙個引數為 基類 的委託例項program
public
static parent method1()
public
static child method2()
}class
parent
class child : parent
classprogram
static
void
test(person p)
}
協變和逆變
協變和逆變都是術語,前者指能夠使用比原始指定的派生型別的派生程度更大的型別,後者指能夠使用比原始指定的派生型別的派生程度更小的型別。using system using system.collections.generic using system.text class derived base s...
協變和逆變
二 真正的協變和逆變 概念 1 以前的泛型系統 或者說沒有in out關鍵字時 是不能 變 的,無論是 逆 還是 順 協 2 當前僅支援介面和委託的逆變與協變 不支援類和方法。但陣列也有協變性。3 值型別不參與逆變與協變。協變 foo foo public class testoutwhere t ...
C 協變逆變
1.泛型的協變逆變 注意 只能放在介面或者委託的泛型引數前面 1 委託泛型引數 static class testconsole private static argumentexception test1 object obj private static exception test2 stri...