Upload
lars-corneliussen
View
2.815
Download
3
Embed Size (px)
DESCRIPTION
Eines der meistbegrüßten Features aus .NET 4 und gleichzeitig eines der am wenigsten verstandenen. Leicht dahergesagt, dass Argumente von Methoden und Delegates schon immer contravariant waren. Und dass in C# 4.0 jetzt noch sichere Co- und Contravarianz für generische Typparameter hinzukommt. Und weil man das mit Co- und Contra so schnell verwechselt heißt es jetzt einfach "out" und "in". Oder war das andersrum? Nicht ganz sicher? Nach dem Vortrag weißt Du es!
Citation preview
Alles Vertragssache!Ko- und Kontravarianz in C#
Lars Corneliussenitemis AG
itemis.delcorneliussen.com
Mittwoch, 25. November 2009
Kovarianz und Kontravarianz ist die Unterscheidung, ob ein Aspekt
gleichartig der Vererbungsrichtung (kovariant)
oder
entgegengesetzt zu dieser (kontravariant)
ist.
Mittwoch, 25. November 2009
Aspekt = Typdeklaration
Mittwoch, 25. November 2009
Varianz = Abweichung
Mittwoch, 25. November 2009
Ko- und Kontravarianz... beschreibt die erlaubte Abweichung vom deklarierten Typ.
Mittwoch, 25. November 2009
string
object
Vererbungrichtung
Mittwoch, 25. November 2009
object meinObjekt = "abcd";
deklarierter Typ
stringobjectVererbungrichtung
Mittwoch, 25. November 2009
object meinObjekt = "abcd";
Abweichung
deklarierter Typ
stringobjectVererbungrichtung
Mittwoch, 25. November 2009
object meinObjekt = "abcd";
Abweichung
kontravariant
deklarierter Typ
stringobjectVererbungrichtung
Mittwoch, 25. November 2009
public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
Mittwoch, 25. November 2009
public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
deklarierter Typ
string
object
Vererbungrichtung
Mittwoch, 25. November 2009
public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
deklarierter Typ
string
object
Vererbungrichtung
Abweichung
Mittwoch, 25. November 2009
Variablen und Parameter sind kontravariant
... sie erlauben Zuweisungen von Werten, deren Typen entgegengesetzt zur Vererbungsrichtung abweichen.
Mittwoch, 25. November 2009
public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
Mittwoch, 25. November 2009
public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
deklarierter Typ
object
string
Vererbungrichtung
Mittwoch, 25. November 2009
public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
deklarierter Typ
object
string
Vererbungrichtung
Abweichung
kovariantMittwoch, 25. November 2009
Methodenrückgabensind kovariant
... sie können Variablen zugewiesen werden, deren Typ gleichartig mit der Vererbungsrichtung abweicht.
Mittwoch, 25. November 2009
Ko- und Kontravarianz in Generics
Mittwoch, 25. November 2009
IList< object > meineObjekte = new List< string >;
Mittwoch, 25. November 2009
IList< object > meineObjekte = new List< string >;
Vererbungrichtung
deklarierter Typ
stringobject
Mittwoch, 25. November 2009
IList< object > meineObjekte = new List< string >;
Vererbungrichtung
deklarierter Typ
stringobject
kontravariant! Fertig!?
Abweichung
Mittwoch, 25. November 2009
Mit string und object kommen wir nicht weit...
Mittwoch, 25. November 2009
Tier
Säugetier Reptil
Mittwoch, 25. November 2009
Das Problem bei einer generischen Liste:
Mittwoch, 25. November 2009
List< >
Mittwoch, 25. November 2009
List< >
IList< >
Mittwoch, 25. November 2009
List< >
IList< >
Peter
Mittwoch, 25. November 2009
List< >
IList< >
Peter
Klaus
Mittwoch, 25. November 2009
List< >
IList< >
Peter
Mittwoch, 25. November 2009
Bis C# 3.0 sind generische Typparameter invariant
... sie können in der Benutzung nicht vom implementierten Typ abweichen.
Mittwoch, 25. November 2009
C# 4 unterstützt...... sichere Ko- und Kontravarianz von generischen Typparametern.
Mittwoch, 25. November 2009
Sehen wir uns mal ein paar Varianten an...
Mittwoch, 25. November 2009
Ein Tier-Geschenk zum auspacken...
Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
IGeschenk< > Hoffentlich ein
Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
Hoffentlich ein
IGeschenk<Tier>Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
Jippie!!! Ein
Tiger!!
IGeschenk<Tiger>Mittwoch, 25. November 2009
IGeschenk< T>Generische Schnittstelle
+ Auspacken() : T
Implementierung
Auspacken() {
return new() ;}
IGeschenk<Säugetier>
Konkrete Schnittstelle
+ Auspacken() :
Mittwoch, 25. November 2009
Ein Tierheim um Tiere abzugeben...
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
ITierheim< > Da bitte!
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
ITierheim<Tier>
Da bitte!
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
IGeschenk<Giraffe>
Da bitte!
Mittwoch, 25. November 2009
ITierheim< T>Generische Schnittstelle
+ Einsperren( T )
Implementierung
Einsperren( ) {
}
??
ITierheim<Säugetier>
Konkrete Schnittstelle
+ Einsperren( )
Mittwoch, 25. November 2009
Ein Tiermarkt zum tauschen von Tieren...
Mittwoch, 25. November 2009
Generische SchnittstelleITiermarkt<T>
+ T Tauschen( T )
Mittwoch, 25. November 2009
Generische SchnittstelleITiermarkt<T>
+ T Tauschen( T )
Implementierung
Tauschen( ) {
return
}
??
Mittwoch, 25. November 2009
Generische SchnittstelleITiermarkt<T>
+ T Tauschen( T )
Implementierung
Tauschen( ) {
return
}
??
ITiermarkt<Säugetier>
Konkrete Schnittstelle
+ Tauschen( )
Mittwoch, 25. November 2009
Generische SchnittstelleITiermarkt<T>
+ T Tauschen( T )
Implementierung
Tauschen( ) {
return
}
??
ITiermarkt<Säugetier>
Konkrete Schnittstelle
+ Tauschen( )
Mittwoch, 25. November 2009
Generische SchnittstelleITiermarkt<T>
+ T Tauschen( T )
Implementierung
Tauschen( ) {
return
}
??
Mittwoch, 25. November 2009
Implementierung
Tauschen( ) {
return
}
??
Mittwoch, 25. November 2009
Implementierung
Tauschen( ) {
return
}
??
Mittwoch, 25. November 2009
Implementierung
Tauschen( ) {
return
}
??
ITiermarkt<Säugetier,Säugetier>
Konkrete Schnittstelle
+ Tauschen( )
Generische SchnittstelleITiermarkt<in I, out O>
+ O Tauschen( I )
Mittwoch, 25. November 2009
Implementierung
Tauschen( ) {
return
}
??
ITiermarkt<Säugetier,Säugetier>
Konkrete Schnittstelle
+ Tauschen( )
Generische SchnittstelleITiermarkt<in I, out O>
+ O Tauschen( I )
Mittwoch, 25. November 2009
ITiermarkt<Giraffe, Tier>.Tauschen()
ITiermarkt<Säugetier, Säugetier>
Säugetier Tauschen ( Säugetier)
Vererbungrichtung
Abweichung
Vererbungrichtung
Mittwoch, 25. November 2009
In C# 4 Generische Typparameter ENTWEDERko- ODER kontravariant
... mit „out“ klassifizierte Typparameter können kovariant abweichen,
... mit „in“ klassifizierte Typparameter können kontravarian abweichen.
Mittwoch, 25. November 2009
Vielen Dankfürs Zugucken!
Lars Corneliussenlcorneliussen.com
Mittwoch, 25. November 2009