63
Alles Vertragssache! Ko- und Kontravarianz in C# Lars Corneliussen itemis AG itemis.de lcorneliussen.com Mittwoch, 25. November 2009

Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

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

Page 1: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Alles Vertragssache!Ko- und Kontravarianz in C#

Lars Corneliussenitemis AG

itemis.delcorneliussen.com

Mittwoch, 25. November 2009

Page 2: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Kovarianz und Kontravarianz ist die Unterscheidung, ob ein Aspekt

gleichartig der Vererbungsrichtung (kovariant)

oder

entgegengesetzt zu dieser (kontravariant)

ist.

Mittwoch, 25. November 2009

Page 3: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Aspekt = Typdeklaration

Mittwoch, 25. November 2009

Page 4: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Varianz = Abweichung

Mittwoch, 25. November 2009

Page 5: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Ko- und Kontravarianz... beschreibt die erlaubte Abweichung vom deklarierten Typ.

Mittwoch, 25. November 2009

Page 6: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

string

object

Vererbungrichtung

Mittwoch, 25. November 2009

Page 7: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

object meinObjekt = "abcd";

deklarierter Typ

stringobjectVererbungrichtung

Mittwoch, 25. November 2009

Page 8: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

object meinObjekt = "abcd";

Abweichung

deklarierter Typ

stringobjectVererbungrichtung

Mittwoch, 25. November 2009

Page 9: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

object meinObjekt = "abcd";

Abweichung

kontravariant

deklarierter Typ

stringobjectVererbungrichtung

Mittwoch, 25. November 2009

Page 10: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

public string Methode( object parameter) {

return "Hallo, Welt!";

}

object x = Methode( "abc" );

Mittwoch, 25. November 2009

Page 11: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

public string Methode( object parameter) {

return "Hallo, Welt!";

}

object x = Methode( "abc" );

deklarierter Typ

string

object

Vererbungrichtung

Mittwoch, 25. November 2009

Page 12: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

public string Methode( object parameter) {

return "Hallo, Welt!";

}

object x = Methode( "abc" );

deklarierter Typ

string

object

Vererbungrichtung

Abweichung

Mittwoch, 25. November 2009

Page 13: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Variablen und Parameter sind kontravariant

... sie erlauben Zuweisungen von Werten, deren Typen entgegengesetzt zur Vererbungsrichtung abweichen.

Mittwoch, 25. November 2009

Page 14: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

public string Methode( object parameter) {

return "Hallo, Welt!";

}

object x = Methode( "abc" );

Mittwoch, 25. November 2009

Page 15: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

public string Methode( object parameter) {

return "Hallo, Welt!";

}

object x = Methode( "abc" );

deklarierter Typ

object

string

Vererbungrichtung

Mittwoch, 25. November 2009

Page 16: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

public string Methode( object parameter) {

return "Hallo, Welt!";

}

object x = Methode( "abc" );

deklarierter Typ

object

string

Vererbungrichtung

Abweichung

kovariantMittwoch, 25. November 2009

Page 17: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Methodenrückgabensind kovariant

... sie können Variablen zugewiesen werden, deren Typ gleichartig mit der Vererbungsrichtung abweicht.

Mittwoch, 25. November 2009

Page 18: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Ko- und Kontravarianz in Generics

Mittwoch, 25. November 2009

Page 19: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IList< object > meineObjekte = new List< string >;

Mittwoch, 25. November 2009

Page 20: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IList< object > meineObjekte = new List< string >;

Vererbungrichtung

deklarierter Typ

stringobject

Mittwoch, 25. November 2009

Page 21: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IList< object > meineObjekte = new List< string >;

Vererbungrichtung

deklarierter Typ

stringobject

kontravariant! Fertig!?

Abweichung

Mittwoch, 25. November 2009

Page 22: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Mit string und object kommen wir nicht weit...

Mittwoch, 25. November 2009

Page 23: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Tier

Säugetier Reptil

Mittwoch, 25. November 2009

Page 24: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Das Problem bei einer generischen Liste:

Mittwoch, 25. November 2009

Page 25: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

List< >

Mittwoch, 25. November 2009

Page 26: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

List< >

IList< >

Mittwoch, 25. November 2009

Page 27: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

List< >

IList< >

Peter

Mittwoch, 25. November 2009

Page 28: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

List< >

IList< >

Peter

Klaus

Mittwoch, 25. November 2009

Page 29: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

List< >

IList< >

Peter

Mittwoch, 25. November 2009

Page 30: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Bis C# 3.0 sind generische Typparameter invariant

... sie können in der Benutzung nicht vom implementierten Typ abweichen.

Mittwoch, 25. November 2009

Page 31: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

C# 4 unterstützt...... sichere Ko- und Kontravarianz von generischen Typparametern.

Mittwoch, 25. November 2009

Page 32: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Sehen wir uns mal ein paar Varianten an...

Mittwoch, 25. November 2009

Page 33: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Ein Tier-Geschenk zum auspacken...

Mittwoch, 25. November 2009

Page 34: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Mittwoch, 25. November 2009

Page 35: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Implementierung

Auspacken() {

return new() ;}

IGeschenk<Säugetier>

Konkrete Schnittstelle

+ Auspacken() :

Mittwoch, 25. November 2009

Page 36: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Implementierung

Auspacken() {

return new() ;}

IGeschenk<Säugetier>

Konkrete Schnittstelle

+ Auspacken() :

IGeschenk< > Hoffentlich ein

Mittwoch, 25. November 2009

Page 37: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Implementierung

Auspacken() {

return new() ;}

IGeschenk<Säugetier>

Konkrete Schnittstelle

+ Auspacken() :

Mittwoch, 25. November 2009

Page 38: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Implementierung

Auspacken() {

return new() ;}

IGeschenk<Säugetier>

Konkrete Schnittstelle

+ Auspacken() :

Hoffentlich ein

IGeschenk<Tier>Mittwoch, 25. November 2009

Page 39: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Implementierung

Auspacken() {

return new() ;}

IGeschenk<Säugetier>

Konkrete Schnittstelle

+ Auspacken() :

Mittwoch, 25. November 2009

Page 40: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

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

Page 41: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

IGeschenk< T>Generische Schnittstelle

+ Auspacken() : T

Implementierung

Auspacken() {

return new() ;}

IGeschenk<Säugetier>

Konkrete Schnittstelle

+ Auspacken() :

Mittwoch, 25. November 2009

Page 42: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Ein Tierheim um Tiere abzugeben...

Mittwoch, 25. November 2009

Page 43: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Mittwoch, 25. November 2009

Page 44: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

Mittwoch, 25. November 2009

Page 45: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

ITierheim< > Da bitte!

Mittwoch, 25. November 2009

Page 46: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

Mittwoch, 25. November 2009

Page 47: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

ITierheim<Tier>

Da bitte!

Mittwoch, 25. November 2009

Page 48: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

Mittwoch, 25. November 2009

Page 49: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

IGeschenk<Giraffe>

Da bitte!

Mittwoch, 25. November 2009

Page 50: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITierheim< T>Generische Schnittstelle

+ Einsperren( T )

Implementierung

Einsperren( ) {

}

??

ITierheim<Säugetier>

Konkrete Schnittstelle

+ Einsperren( )

Mittwoch, 25. November 2009

Page 51: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Ein Tiermarkt zum tauschen von Tieren...

Mittwoch, 25. November 2009

Page 52: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Generische SchnittstelleITiermarkt<T>

+ T Tauschen( T )

Mittwoch, 25. November 2009

Page 53: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Generische SchnittstelleITiermarkt<T>

+ T Tauschen( T )

Implementierung

Tauschen( ) {

return

}

??

Mittwoch, 25. November 2009

Page 54: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Generische SchnittstelleITiermarkt<T>

+ T Tauschen( T )

Implementierung

Tauschen( ) {

return

}

??

ITiermarkt<Säugetier>

Konkrete Schnittstelle

+ Tauschen( )

Mittwoch, 25. November 2009

Page 55: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Generische SchnittstelleITiermarkt<T>

+ T Tauschen( T )

Implementierung

Tauschen( ) {

return

}

??

ITiermarkt<Säugetier>

Konkrete Schnittstelle

+ Tauschen( )

Mittwoch, 25. November 2009

Page 56: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Generische SchnittstelleITiermarkt<T>

+ T Tauschen( T )

Implementierung

Tauschen( ) {

return

}

??

Mittwoch, 25. November 2009

Page 57: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Implementierung

Tauschen( ) {

return

}

??

Mittwoch, 25. November 2009

Page 58: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Implementierung

Tauschen( ) {

return

}

??

Mittwoch, 25. November 2009

Page 59: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Implementierung

Tauschen( ) {

return

}

??

ITiermarkt<Säugetier,Säugetier>

Konkrete Schnittstelle

+ Tauschen( )

Generische SchnittstelleITiermarkt<in I, out O>

+ O Tauschen( I )

Mittwoch, 25. November 2009

Page 60: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Implementierung

Tauschen( ) {

return

}

??

ITiermarkt<Säugetier,Säugetier>

Konkrete Schnittstelle

+ Tauschen( )

Generische SchnittstelleITiermarkt<in I, out O>

+ O Tauschen( I )

Mittwoch, 25. November 2009

Page 61: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

ITiermarkt<Giraffe, Tier>.Tauschen()

ITiermarkt<Säugetier, Säugetier>

Säugetier Tauschen ( Säugetier)

Vererbungrichtung

Abweichung

Vererbungrichtung

Mittwoch, 25. November 2009

Page 62: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

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

Page 63: Alles Vertragssache - Ko- und Kontravarianz in C# 1-4

Vielen Dankfürs Zugucken!

Lars Corneliussenlcorneliussen.com

Mittwoch, 25. November 2009