1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C# Vererbung innerhalb von generischen Typen

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von Cymatoxa, 22. April 2015.

  1. Cymatoxa

    Cymatoxa Mitglied

    Hi,

    ich bin relativ neu in C#.
    Ich möchte einer Liste Container-Objekte hinzufügen, die wiederum einen Generischen Typen haben. Dieser soll von einer Basisklasse erben, ist aber sonst nicht bestimmt. Dies wird nicht so einfach zugelassen:
    Code (Text):
    1. public abstract class Content {
    2.   // Some abstract stuff
    3.   // and some implementations...
    4. }
    5.  
    6. public class ContentImpl : Content
    7. {
    8.   // Implementation
    9. }
    10.  
    11. public class Container<T> where T : Content
    12. {
    13.   // Lists, Setter, getter, etc.
    14. }
    15.  
    16. public class Manager
    17. {
    18.   List<Container<Content>> list = new List<Container<Content>>();
    19.  
    20.   public void add<T>(Container<T> cont) where T : Content
    21.   {
    22.     list.Add(cont); // FEHLER
    23.     // Warum ist das nicht erlaubt?
    24.     // T muss doch von Content erben.
    25.   }
    26. }
    Wie bekomme ich diese "generisch-generischen" Objekte in eine Liste?
    Muss ich die ganze Liste dazu Typlos halten? Was wäre die "schönste" Lösung?

    Danke für eure Hilfe
     
  2. sheel

    sheel I love Asm Administrator

    Hi

    die List ist nicht das Problem, aber das Container<> drin.
    Während ein Objekt von zB. ContentImpl, erbend von Content, natürlich schon in eine Content-Variable rein kann,
    geht das mit "Vererbungs-Generics" wie Container<Content> und Container<ContentImpl> wirklich nicht.

    Grund:
    (edit: Der Code hier zeigt das Problem schön: http://stackoverflow.com/a/4653199/3134621)
    Stellen von Container, die den Templatetyp verwenden, zB. eine Methode die ein T als Parameter bekommt,
    würden ja bei Container<ContentImpl> nur ContentImpl (und Kinder davon), aber kein Content akzeptieren.
    Sämtlicher Code (und auch der Compiler wegen Fehlerprüfungen und Optimierungen) kann sich darauf verlassen.
    Wenn man jetzt ein Objekt vom Typ Container<ContentImpl> in eine Variable vom Typ Container<Content>
    zuweisen könnte müsste das Objekt natürlich alle Methoden von Container<Content> anbieten...
    damit hat man das Risiko, dass doch was anderes als ContentImpl(kidner) reinkommt.
    Nämlich ein reines Content. => Alles im A*.

    Unter bestimmten Einschränkungen an die Klasse gehts evt. doch, aber einfach eine ungetypte Liste
    verwenden und bei Bedarf casten geht auf jeden Fall auch. Nur sollte man dann eben selber prüfen,
    dass sich solche Problemsituationen wie oben nicht ergeben. Man kann ja ziemlich einfach prüfen,
    ob irgendein Objekt zu einer Klasse gehört.
     
    Cymatoxa gefällt das.
  3. Cymatoxa

    Cymatoxa Mitglied

    Okay,

    vielen Dank für diese ausführliche Antwort (und sorry, dass meine Rückmeldung erst so spät kommt)

    Schöne Grüße
     
Die Seite wird geladen...
Ähnliche Themen - Vererbung innerhalb generischen
  1. F0117375
    Antworten:
    1
    Aufrufe:
    491