C# Vererbung innerhalb von generischen Typen

#1
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:
public abstract class Content {
  // Some abstract stuff
  // and some implementations...
}

public class ContentImpl : Content
{
  // Implementation
}

public class Container<T> where T : Content
{
  // Lists, Setter, getter, etc.
}

public class Manager
{
  List<Container<Content>> list = new List<Container<Content>>();

  public void add<T>(Container<T> cont) where T : Content
  {
    list.Add(cont); // FEHLER
    // Warum ist das nicht erlaubt?
    // T muss doch von Content erben.
  }
}
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
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.
 

Neue Beiträge