Alles
                              Vertragssache!
                              Ko- und Kontravarianz in C#



          ...
Kovarianz und Kontravarianz ist die
                              Unterscheidung, ob ein Aspekt

                         ...
Aspekt = Typdeklaration




Mittwoch, 25. November 2009
Varianz = Abweichung




Mittwoch, 25. November 2009
Ko- und Kontravarianz
                      ... beschreibt die erlaubte Abweichung vom
                      deklarierten ...
object


                Vererbungrichtung



                                    string



Mittwoch, 25. November 2009
deklarierter Typ


                              Vererbungrichtung
          object                                  strin...
deklarierter Typ


                              Vererbungrichtung
          object                                  strin...
deklarierter Typ


                               Vererbungrichtung
          object                                   str...
public string Methode( object parameter) {

             return "Hallo, Welt!";

      }




    object x = Methode( "abc"...
deklarierter Typ
                                            object
      public string Methode( object parameter) {

    ...
deklarierter Typ
                                            object
      public string Methode( object parameter) {

    ...
Variablen und Parameter
       sind kontravariant
                        ... sie erlauben Zuweisungen von Werten,
       ...
public string Methode( object parameter) {

             return "Hallo, Welt!";

      }




    object x = Methode( "abc"...
deklarierter Typ
                              string
      public string Methode( object parameter) {

             retur...
deklarierter Typ
                              string
      public string Methode( object parameter) {

             retur...
Methodenrückgaben
       sind kovariant
                        ... sie können Variablen zugewiesen werden,
              ...
Ko- und Kontravarianz in
                        Generics



Mittwoch, 25. November 2009
IList<                     object   > meineObjekte
                                           = new List<   string   >;


...
deklarierter Typ


                                           Vererbungrichtung
                              object
     ...
deklarierter Typ


                                           Vererbungrichtung
                              object
     ...
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<                    >




                                               Peter

                              IList< ...
List<           >




                                      Peter

  Klaus IList<                    >




Mittwoch, 25. N...
List<                    >




                                               Peter

                              IList< ...
Bis C# 3.0 sind
       generische Typparameter
       invariant
                        ... sie können in der Benutzung ni...
C# 4 unterstützt...
                         ... sichere Ko- und Kontravarianz von
                         generischen Ty...
Sehen wir uns mal ein
                         paar Varianten an...



Mittwoch, 25. November 2009
Ein Tier-Geschenk zum
                            auspacken...



Mittwoch, 25. November 2009
Generische Schnittstelle
                                                         IGeschenk<    T>

                      ...
Generische Schnittstelle
Implementierung                                                IGeschenk<        T>

            ...
Generische Schnittstelle
Implementierung                                                 IGeschenk<        T>

           ...
Generische Schnittstelle
Implementierung                                                IGeschenk<        T>

            ...
Generische Schnittstelle
Implementierung                                                 IGeschenk<        T>

           ...
Generische Schnittstelle
Implementierung                                                IGeschenk<        T>

            ...
Generische Schnittstelle
Implementierung                                                IGeschenk<        T>

            ...
Generische Schnittstelle
Implementierung                                                IGeschenk<        T>

            ...
Ein Tierheim um Tiere
                              abzugeben...



Mittwoch, 25. November 2009
Generische Schnittstelle
                                                         ITierheim<   T>

                       ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Generische Schnittstelle
Implementierung                                               ITierheim<     T>

                ...
Ein Tiermarkt zum
                          tauschen von Tieren...



Mittwoch, 25. November 2009
Generische Schnittstelle
                                                          ITiermarkt<T>

                        ...
Generische Schnittstelle
Implementierung                                                   ITiermarkt<T>

                ...
Generische Schnittstelle
Implementierung                                                        ITiermarkt<T>

           ...
Generische Schnittstelle
Implementierung                                                        ITiermarkt<T>

           ...
Generische Schnittstelle
Implementierung                                                   ITiermarkt<T>

                ...
Implementierung




                                  Tauschen(   ) {


                                     ??




      ...
Implementierung




                                  Tauschen(   ) {


                                     ??




      ...
Generische Schnittstelle
Implementierung                                                      ITiermarkt<in I, out O>

   ...
Generische Schnittstelle
Implementierung                                                      ITiermarkt<in I, out O>

   ...
ITiermarkt<Giraffe, Tier>.Tauschen()                        Ve
                                                           ...
In C# 4 Generische
       Typparameter
       ENTWEDER
       ko- ODER kontravariant
                        ... mit „out“...
Vielen Dank
                              fürs Zugucken!

                                        Lars Corneliussen
      ...
Upcoming SlideShare
Loading in...5
×

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

2,640

Published on

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!

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,640
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Alles Vertragssache! Ko- und Kontravarianz in C# Lars Corneliussen itemis AG itemis.de lcorneliussen.com Mittwoch, 25. November 2009
  2. 2. Kovarianz und Kontravarianz ist die Unterscheidung, ob ein Aspekt gleichartig der Vererbungsrichtung (kovariant) oder entgegengesetzt zu dieser (kontravariant) ist. Mittwoch, 25. November 2009
  3. 3. Aspekt = Typdeklaration Mittwoch, 25. November 2009
  4. 4. Varianz = Abweichung Mittwoch, 25. November 2009
  5. 5. Ko- und Kontravarianz ... beschreibt die erlaubte Abweichung vom deklarierten Typ. Mittwoch, 25. November 2009
  6. 6. object Vererbungrichtung string Mittwoch, 25. November 2009
  7. 7. deklarierter Typ Vererbungrichtung object string object meinObjekt = "abcd"; Mittwoch, 25. November 2009
  8. 8. deklarierter Typ Vererbungrichtung object string object meinObjekt = "abcd"; Abweichung Mittwoch, 25. November 2009
  9. 9. deklarierter Typ Vererbungrichtung object string object meinObjekt = "abcd"; Abweichung kontravariant Mittwoch, 25. November 2009
  10. 10. public string Methode( object parameter) { return "Hallo, Welt!"; } object x = Methode( "abc" ); Mittwoch, 25. November 2009
  11. 11. deklarierter Typ object public string Methode( object parameter) { return "Hallo, Welt!"; } Vererbungrichtung string object x = Methode( "abc" ); Mittwoch, 25. November 2009
  12. 12. deklarierter Typ object public string Methode( object parameter) { return "Hallo, Welt!"; } Abweichung Vererbungrichtung string object x = Methode( "abc" ); Mittwoch, 25. November 2009
  13. 13. Variablen und Parameter sind kontravariant ... sie erlauben Zuweisungen von Werten, deren Typen entgegengesetzt zur Vererbungsrichtung abweichen. Mittwoch, 25. November 2009
  14. 14. public string Methode( object parameter) { return "Hallo, Welt!"; } object x = Methode( "abc" ); Mittwoch, 25. November 2009
  15. 15. deklarierter Typ string public string Methode( object parameter) { return "Hallo, Welt!"; } Vererbungrichtung object object x = Methode( "abc" ); Mittwoch, 25. November 2009
  16. 16. deklarierter Typ string public string Methode( object parameter) { return "Hallo, Welt!"; } Vererbungrichtung Abweichung object object x = Methode( "abc" ); kovariant Mittwoch, 25. November 2009
  17. 17. Methodenrückgaben sind kovariant ... sie können Variablen zugewiesen werden, deren Typ gleichartig mit der Vererbungsrichtung abweicht. Mittwoch, 25. November 2009
  18. 18. Ko- und Kontravarianz in Generics Mittwoch, 25. November 2009
  19. 19. IList< object > meineObjekte = new List< string >; Mittwoch, 25. November 2009
  20. 20. deklarierter Typ Vererbungrichtung object string IList< object > meineObjekte = new List< string >; Mittwoch, 25. November 2009
  21. 21. deklarierter Typ Vererbungrichtung object string IList< object > meineObjekte = new List< string >; Abweichung kontravariant! Fertig!? Mittwoch, 25. November 2009
  22. 22. Mit string und object kommen wir nicht weit... Mittwoch, 25. November 2009
  23. 23. Tier Säugetier Reptil Mittwoch, 25. November 2009
  24. 24. Das Problem bei einer generischen Liste: Mittwoch, 25. November 2009
  25. 25. List< > Mittwoch, 25. November 2009
  26. 26. List< > IList< > Mittwoch, 25. November 2009
  27. 27. List< > Peter IList< > Mittwoch, 25. November 2009
  28. 28. List< > Peter Klaus IList< > Mittwoch, 25. November 2009
  29. 29. List< > Peter IList< > Mittwoch, 25. November 2009
  30. 30. Bis C# 3.0 sind generische Typparameter invariant ... sie können in der Benutzung nicht vom implementierten Typ abweichen. Mittwoch, 25. November 2009
  31. 31. C# 4 unterstützt... ... sichere Ko- und Kontravarianz von generischen Typparametern. Mittwoch, 25. November 2009
  32. 32. Sehen wir uns mal ein paar Varianten an... Mittwoch, 25. November 2009
  33. 33. Ein Tier-Geschenk zum auspacken... Mittwoch, 25. November 2009
  34. 34. Generische Schnittstelle IGeschenk< T> + Auspacken() : T Mittwoch, 25. November 2009
  35. 35. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle Mittwoch, 25. November 2009
  36. 36. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle IGeschenk< > Hoffentlich ein Mittwoch, 25. November 2009
  37. 37. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle Mittwoch, 25. November 2009
  38. 38. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle Hoffentlich ein IGeschenk<Tier> Mittwoch, 25. November 2009
  39. 39. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle Mittwoch, 25. November 2009
  40. 40. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle Jippie!!! Ein Tiger!! IGeschenk<Tiger> Mittwoch, 25. November 2009
  41. 41. Generische Schnittstelle Implementierung IGeschenk< T> + Auspacken() : T Auspacken() { IGeschenk<Säugetier> return new() + Auspacken() : ; } Konkrete Schnittstelle Mittwoch, 25. November 2009
  42. 42. Ein Tierheim um Tiere abzugeben... Mittwoch, 25. November 2009
  43. 43. Generische Schnittstelle ITierheim< T> + Einsperren( T ) Mittwoch, 25. November 2009
  44. 44. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle Mittwoch, 25. November 2009
  45. 45. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle ITierheim< > Da bitte! Mittwoch, 25. November 2009
  46. 46. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle Mittwoch, 25. November 2009
  47. 47. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle Da bitte! ITierheim<Tier> Mittwoch, 25. November 2009
  48. 48. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle Mittwoch, 25. November 2009
  49. 49. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle Da bitte! IGeschenk<Giraffe> Mittwoch, 25. November 2009
  50. 50. Generische Schnittstelle Implementierung ITierheim< T> + Einsperren( T ) Einsperren( ) { ITierheim<Säugetier> ?? + Einsperren( ) } Konkrete Schnittstelle Mittwoch, 25. November 2009
  51. 51. Ein Tiermarkt zum tauschen von Tieren... Mittwoch, 25. November 2009
  52. 52. Generische Schnittstelle ITiermarkt<T> + T Tauschen( T ) Mittwoch, 25. November 2009
  53. 53. Generische Schnittstelle Implementierung ITiermarkt<T> + T Tauschen( T ) Tauschen( ) { ?? return } Mittwoch, 25. November 2009
  54. 54. Generische Schnittstelle Implementierung ITiermarkt<T> + T Tauschen( T ) Tauschen( ) { ITiermarkt<Säugetier> ?? + Tauschen( ) Konkrete Schnittstelle return } Mittwoch, 25. November 2009
  55. 55. Generische Schnittstelle Implementierung ITiermarkt<T> + T Tauschen( T ) Tauschen( ) { ITiermarkt<Säugetier> ?? + Tauschen( ) Konkrete Schnittstelle return } Mittwoch, 25. November 2009
  56. 56. Generische Schnittstelle Implementierung ITiermarkt<T> + T Tauschen( T ) Tauschen( ) { ?? return } Mittwoch, 25. November 2009
  57. 57. Implementierung Tauschen( ) { ?? return } Mittwoch, 25. November 2009
  58. 58. Implementierung Tauschen( ) { ?? return } Mittwoch, 25. November 2009
  59. 59. Generische Schnittstelle Implementierung ITiermarkt<in I, out O> + O Tauschen( I ) Tauschen( ) { ITiermarkt<Säugetier, Säugetier> ?? + Tauschen( ) Konkrete Schnittstelle return } Mittwoch, 25. November 2009
  60. 60. Generische Schnittstelle Implementierung ITiermarkt<in I, out O> + O Tauschen( I ) Tauschen( ) { ITiermarkt<Säugetier, Säugetier> ?? + Tauschen( ) Konkrete Schnittstelle return } Mittwoch, 25. November 2009
  61. 61. ITiermarkt<Giraffe, Tier>.Tauschen() Ve rer Ab bu we ngr ich ich un tu g ng ITiermarkt<Säugetier, Säugetier> Säugetier Tauschen ( Säugetier) Vererbungrichtung Mittwoch, 25. November 2009
  62. 62. In C# 4 Generische Typparameter ENTWEDER ko- ODER kontravariant ... mit „out“ klassifizierte Typparameter können kovariant abweichen, ... mit „in“ klassifizierte Typparameter können kontravarian abweichen. Mittwoch, 25. November 2009
  63. 63. Vielen Dank fürs Zugucken! Lars Corneliussen lcorneliussen.com Mittwoch, 25. November 2009
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×