Kovarianz / Kontravarianz in C #

7

Ich habe ein Buch , das die Kontravarianz / Kovarianz wie folgt erklärt:

  
  • Ein Delegat kann spezifischere Parameter als sein Methodenziel haben. Dies wird Contravarianz
  • genannt   
  • Der Rückgabetyp eines Delegaten kann weniger spezifisch als der Rückgabetyp seiner Zielmethode sein. Dies wird Kovarianz
  • genannt   

Und das ist ein Beispiel.

%Vor%

Ich dachte, um Kovarianz / Kontravarianz zu verwenden, muss new verwendet werden, wie im Beispiel gezeigt wird, aber ich scheine das gleiche Ergebnis mit sa = ActionObject und o = RetrieveString zu erhalten. (Ich testete mit Mono).

  • Warum benutzt der Schreiber dann new , um Kovarianz / Kontravarianz zu erklären?
  • Was ist die Theorie hinter der Kovarianz / Contravarianz Idee? Ist es nur ein fantastischer Name, der object x = Everything inherit from object beschreibt? Woher kommt dieser komische Name? Was nutzt es dafür?
prosseek 23.07.2011, 01:57
quelle

4 Antworten

18
  

Ich habe ein Buch, das die Kontravarianz / Kovarianz wie folgt erklärt ...

Das ist keine sehr gute Erklärung für die Varianz. Es ist völlig unklar genau was es ist das heißt "Kovarianz" und "Kontravarianz".

Das Ding, das eigentlich eine Variante ist, wird nie erwähnt. Die kontravariante Sache ist die Zuordnung von einem Typ zu einem Delegaten mit einem Parameter dieses Typs . Kontravarianz ist eine Eigenschaft von Zuordnungen und Beziehungen .

Versuchen Sie, dies zu lesen und sehen Sie, ob Sie es besser verstehen:

Ссылка

  

Ich dachte, um Kovarianz / Kontravarianz zu verwenden, muss man neu verwenden, wie im Beispiel gezeigt wird, aber ich scheine das gleiche Ergebnis zu erhalten ...

Seit C # 2.0 kann man entweder "d = M" oder "d = new D (M)" sagen - der Compiler erkennt sie einfach als zwei verschiedene Möglichkeiten, um dasselbe Ding zu schreiben.

  

Warum verwendet der Schreiber die Kovarianz / Kontravarianz neu?

Ich weiß es nicht.

  

Was ist die Theorie hinter der Kovarianz / Kontravarianz Idee?

Die Theorie besagt, dass wenn Sie eine Ordnung Beziehung haben - das heißt, X ist größer als Y, wenn es zulässig ist, X x = (Y) y zu sagen - und Sie haben ein < em> Mapping das behält die Ordnungsbeziehung bei, dann ist das Mapping kovariant. Wenn die Ordnungsbeziehung umkehrt, ist kontravariant .

Angenommen, Animal ist ein größerer Typ als Giraffe. Sie können also einer Variablen vom Typ Animal ein Objekt vom Typ Giraffe zuweisen. Tier & gt; Giraffe.

Machen Sie nun eine Zuordnung von einem Typ T zu einer Methode M-das-braucht-ein-T und zu einem Delegattyp D-das-braucht-ein-T.

Sie können einer Variablen vom Typ D, die eine Giraffe aufnimmt, eine Methode M-das-nimmt-ein-Tier zuweisen. D (Giraffe) & gt; M (Tier) aber Tier & gt; Giraffe. Die Beziehung ist umgekehrt ; Das Mapping ist kontravariant .

  

Ist es nur ein fantastischer Name, der das Objekt beschreibt x = Alles vom Objekt geerbt?

Nein. Es ist verwandt mit diesem Konzept, weil Objekt ein größerer Typ als fast jeder andere Typ ist. Aber was eigentlich eine Variante ist, ist ein Mapping , das eine Größenbeziehung beibehält oder umkehrt.

Versuchen Sie, dies zu lesen und sehen Sie, ob es hilft.

Ссылка

  

Woher kommt dieser komische Name?

Kategorientheorie.

    
Eric Lippert 23.07.2011, 05:32
quelle
2

Die beste Information, die Kovarianz / Kontravarianz in der C # beschreibt, die ich je gesehen habe, ist eine Reihe von Blog-Posts von Eric Lippert hier . Siehe beginnend am Ende der Liste, elf Teile-Serie.

Es ist manchmal schwer zu lesen. Aber es erklärt alles, was man am Anfang fragen kann. :)

Es wurde vor der eigentlichen C # 4.0-Implementierung geschrieben, daher ist eine Diskussion der Syntax veraltet, aber alles andere scheint wie beschrieben implementiert zu sein.

    
Ivan Danilov 23.07.2011 02:03
quelle
1

Hier ist ein großartiger Wiki-Artikel: hier

Es kommt mehr darauf an, in welche Richtung der Trichter fließt und wie breit der Trichter auf einem geeigneten Niveau ist ...

    
Rikon 23.07.2011 02:13
quelle
-1

Keine Ahnung, was Sie in Ihrer ersten Frage meinen.

Die zweite Frage kann beantwortet werden, indem man das Casting anschaut. Die Kontravarianz erlaubt es Klasse A mit einer erweiterten Klasse B als Klasse B zu speichern.

Kontravarianz

%Vor%

Kovarianz erlaubt Klasse B, die Klasse A erweitert, aber als Klasse A gespeichert.

Kovarianz

%Vor%     
Suroot 23.07.2011 02:04
quelle

Tags und Links