Hi,
ich versuche gerade eine Basisklasse zu entwerfen, von der ich später ableiten kann. Diese Basisklasse soll eine generische Liste des eigenen Typen erhalten.
Ich habe also Klasse A, die eine Liste von weiteren A-Objekten enthält.
Jetzt möchte ich aber eine Klasse B von Klasse A ableiten können. Klasse B soll jetzt automatisch eine Liste von weiteren B-Objekten enthalten. Die Liste soll also auf B spezialisiert werden.
Es soll nicht möglich sein, Objekte der Klasse C, D, E usw., die ebenfalls von Klasse A abgeleitet sind, hinzuzufügen.
Ich habe schon einige Zeit gegoogelt und gesucht, aber scheinbar finde ich keine passenden Stichworte dazu.
Ist das möglich? Kann mir jemand die Vorgehensweise erklären?
Ich hoffe das fällt nicht zu sehr ins Thema Grundlagen...
edit:
ok, so funktioniert es, aber gibt es auch noch eine andere Möglichkeit, bei der Klasse A nicht generisch sein muss?
public class A<T>
{
public List<T> Liste { get; set; }
}
public class B : A<B>
{
}
Meinst Du sowas?
public class MyBaseClass<T>
{
public IEnumerable<T> List { get; set; }
}
public class MyAClass : MyBaseClass<MyAClass>
{
public MyAClass( )
{
List = new List<MyAClass>( );
}
}
Mein Edit auf Dein Edit:
Irgendwie musst Du ja den Typ der Liste übergeben; und da verwendet man eben generische Klassen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ok, schade... Ich habe mir erträumt es gäbe z.B. sowas wie
public class A
{
public List<GetType()> Liste { get; set; }
}
public class B : A
{
}
Was natürlich so nicht funktionieren kann...
Trotzdem Danke 😃
Wenn B von A erbt muss es auch _exakt _ denselben List-Typ zurückgeben
also List<A>.
Wenn beide von einer generischen Basisklasse erben, ist es aber möglich.
public class Base<T> where T : Base<T>
{
public List<T> Liste { get; set; }
public string Tag { get; set; } //EDIT: Nur für Demozweck, hat mit dem gener. Mechanismus nix zu tun
}
public class A : Base<A>
{
}
public class B : Base<B>
{
}
/* Verwendung */
var a = new A { Tag = "ParentA" };
a.Liste = new List<A>();
a.Liste.AddRange(new[] { new A { Tag = "A1" }, new A { Tag = "A2" } });
var b = new B { Tag = "ParentB" };
b.Liste = new List<B>();
b.Liste.AddRange(new[] { new B { Tag = "B1" }, new B { Tag = "B2" } });
}
Gruß,
Christoph