協變和逆變

2022-01-11 10:16:04 字數 1296 閱讀 6305

假設有這樣乙個類:

class

person : icloneable

}

但是由於我們知道是返回乙個person類的例項,所以返回型別 object 寫在這裡總會覺得很彆扭,我們希望寫成: 

class

person : icloneable

}

顯然,這是錯的!雖然這是錯的,但這就是返回型別的協變性,只是非泛型介面和方法過載不支援這一特性.如果一定要這樣寫,只能使用顯示介面實現:

class

person : icloneable

public

person clone()

}

如果定義的是 icloneable型別, 則呼叫上面的方法;

如果定義的是 person 型別,則呼叫下面的方法;

假設我們有這樣乙個類:

class

person

}

我們想在派生類中寫如下乙個方法:

class

student : person

}

看起來很合理, 因為 object 是基類,肯定可以接受 person 類的例項呀,這稱為引數型別的逆變性但實際上,和協變一樣,非泛型介面介面和方法不支援乙個返回值為 基類 的委託變數,可以接收乙個返回值為 派生類 的委託例項

class

program

public

static parent method1()

public

static child method2()

}class

parent

class child : parent

乙個引數為 派生類 的委託變數, 可以接收乙個引數為 基類 的委託例項

class

program

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...