Kovariancia és ellentmondás az egyetemes sablonokban

A "kovariancia" és a "kontravariancia" kifejezés azt a lehetőséget jelenti, hogy az eredetileg meghatározottnál kisebb vagy nagyobb öröklési mélységet használnak. Az univerzális típusok paraméterei támogatják a kovarianciát és az ellentmondást, és nagyobb rugalmasságot biztosítanak az univerzális típusok hozzárendelésében és használatában. Az alábbiakban a "covariancia", "ellentmondás" és "invariancia" fogalmak meghatározása a típusrendszer összefüggésében. Ez a példa azt feltételezi, hogy létezik egy Base nevű alap-osztály és egy Derived nevű származtatott osztály.

Lehetővé teszi az eredetileg meghatározottnál nagyobb örökség mélységét.

IE számtalan példány (IEnumerable (Of Derived) a Visual Basicben) egy IEnumerable típusú változóhoz rendelhető.

Lehetővé teszi a generikusabb (alacsonyabb öröklési mélységgel) használatát az eredetileg meghatározottnál.

IE számtalan példány (IEnumerable (Of Base) a Visual Basicben) egy IEnumerable típusú változóhoz rendelhető.

Ez azt jelenti, hogy csak az eredetileg megadott típust használhatja. Így az invariáns univerzális típus paramétere sem kovariáns, sem ellentmondásos.

IE számtalan példány (IEnumerable (Of Base) a Visual Basicben) nem rendelhető IEnumerable típusú változóhoz. és fordítva.

A kovariáns típusú paraméterek lehetővé teszik olyan megbízások létrehozását, amelyek nagyon hasonlítanak a normál polimorfizmus (C # programozási útmutató). mint a következő kód.

Ez úgy tűnhet, mintha visszalépne volna, de ez egy olyan típusú, biztonságos kód, amely összeáll és végrehajtásra kerül. A lambda kifejezés megegyezik a hozzárendelt küldöttel, és meghatároz egy olyan eljárást, amely egy paramétert tartalmaz az alap típusával, és nincs visszatérési értéke. Az így létrejött delegált hozzárendelhető egy Action változóhoz. mivel a cselekvési delegált T paramétere ellentmondásos. A kód típusbiztos, mert T megadja a paraméter típusát. Amikor egy cselekvés delegált úgy hívják, mintha az akció típusának küldötte lenne. az érvelésnek Derived típusú érvnek kell lennie. Ez az argumentum mindig biztonságosan átadható az alapmódszernek, mert a módszer paraméter egy alap típusú paraméter.

Általában egy kváziáns típusú paraméter használható a küldött visszatérési típusaként, és az ellentmondásos típus paraméterei paramétertípusként használhatók. Az interfész esetében a kovariáns típusú paraméterek használhatók visszatérési módok visszatérési típusainak, és az ellentmondásos típus paraméterei használhatók interface type paramétertípusokként.

Együtt, a kovariancia és az ellentmondás nevezik variációk. Az univerzális típus paramétereit, amelyek nem jelennek meg kovariánsnak vagy ellentmondásosnak, invariánsnak nevezik. Rövid információk a közös nyelvi futásidő változékonyságáról:

A .NET-keretrendszer 4-es verziójában a következő interfészek és delegált típusok kváziáns és / vagy ellentmondásos típusú paramétereket tartalmaznak.

Az univerzális interfész vagy az univerzális delegált módszer típusa lehet mind kovariáns, mind ellentmondásos típusparaméter.

A változékonyság csak a referenciatípusokra alkalmazható; ha megad egy értéktípust egy változat típusú paraméternek, akkor ez a típusú paraméter az eredetileg létrehozott típushoz képest invariáns.

A változóképesség nem alkalmazható a küldöttek egyesülésére. Ezért a két cselekvés két delegátora esetében és a cselekvés (Művelet (származtatott) és Művelet (Alapvető) a Visual Basic-ben), akkor az első delegált és a második nem kombinálható, annak ellenére, hogy az eredmény biztonságos típus. A változékonyság lehetővé teszi, hogy hozzárendeljen egy második delegált egy Action változóhoz. De a küldöttek csak akkor kapcsolhatók össze, ha a típusuk pontosan egyezik.

A következő alfejezetekben részletesen ismertetik a kovariáns és az ellentmondásos típusú paramétereket.

A .NET-keretrendszer 4-es verziójában a következő interfészek és delegált típusok kváziáns és / vagy ellentmondásos típusú paramétereket tartalmaznak. Az UI automatizálási rendszermag elhomályosítja az UI különböző részein található struktúrák közötti különbségeket. Ez azt jelenti, hogy a küldöttek hozzárendelhetők olyan változókhoz, amelyek több származtatott paramétertípussal rendelkeznek, és (a Func generikus delegált módszerek esetében) kevésbé származtatott visszatérési típusok.

Az univerzális delegált módszerek általános típusának utolsó paramétere Func jelzi a visszatérő érték típusát a delegált aláírásban. Kovariáns (kulcsszó), míg az univerzális típus egyéb paraméterei ellentmondásosak (a kulcsszó).

Ezt a következő kód illusztrálja. Az első rész a kód osztályát definiálja nevű Base. osztály a Származtatott névvel. osztály örökli Base. és egy másik osztály egy módszert, például a statikus (Megosztott Visual Basic) és a nevét MyMethod. Ez a módszer egy példánya Base és visszaad egy példánya a származtatott. (. Ha az argumentum egy példánya származtatott MyMethod módszer visszaadja azt, ha az argumentum egy példánya Base MyMethod metódus visszaad egy új példánya a származtatott ..) A Main () függvény például létrehoz egy példányt Func (Func (Alap, származtatott) Visual Basicben), amely a MyMethod módszert képviseli. és az f1 változónál van tárolva.

A .NET-keretrendszer 2.0 verziójától kezdődően a CLR támogatja az egyetemes típusú paraméterek változatát. A .NET-keretrendszer 4 előtt egyetlen olyan általános osztály meghatározása, amely ilyen jegyzetekkel rendelkezik, a MSIL nyelv használata volt: vagy egy osztály összeállításával a Ilasm.exe program segítségével (IL Assembler). vagy egy dinamikus szerelvénybe való bevezetésével.

A kovariáns típusú paramétert a ki kulcsszó jelöli ki (Out kulcsszó a Visual Basicben, a + MSIL Assembler kulcsszó). A kovariáns típusú paraméter használható a felülethez tartozó módszer visszatérési értékeként vagy a delegált visszatérési típusaként. A kovariáns típusú paraméter nem használható univerzális típusú korlátozásként az interfész-módszerekhez.

Ha az interfész-módszer egy paraméterrel rendelkezik az univerzális delegált módszer típusával, akkor ennek az illesztési típusnak a kovariáns típusú paramétere használható arra, hogy meghatározza a delegált típusú kontravariáns típusú paramétert.

Az ellentmondásos típus paraméterét a kulcsszó (a kulcsszó a Visual Basicben, a MSIL Assembler kulcsszava) jelöli. A kontravariáns típusú paramétert a felülethez tartozó módszer paramétertípusaként vagy a delegált paraméter típusaként használhatja. Az ellentmondásos típusú paraméter használható az univerzális típusú korlátozásként az interfész módszer számára.

Egy változat típusának paraméterei csak interfésztípusokkal és delegált típusúak lehetnek. Az interfész típus vagy delegált típus lehet mind kovariáns, mind ellentmondásos típusparaméter.

A Visual Basic és a C # nyelvek nem teszik lehetővé a kovariáns és kontravariáns típusok használatának szabályait, illetve a kovariancia vagy ellentmondásos megjegyzések hozzáadását olyan típusparaméterekhez, amelyek nem a kapcsolódási pontok és a küldöttek. Az UI automatizálási rendszermag elhomályosítja az UI különböző részein található struktúrák közötti különbségeket.