Laden...

[gelöst] Generische Liste der eigenen Klasse nach vererbung

Erstellt von MorphieX vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.242 Views
M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren
[gelöst] Generische Liste der eigenen Klasse nach vererbung

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>
{
}
16.841 Beiträge seit 2008
vor 11 Jahren

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.

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren

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 😃

C
9 Beiträge seit 2012
vor 11 Jahren

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

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren

exakt so habe ich es jetzt auch gelöst und bin damit recht zufrieden. 😃