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

Preview:

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

Recommended