Entwickler-Ecke

Basistechnologien - List<T>.Item überschreiben


wulfskin - Sa 26.07.08 12:15
Titel: List<T>.Item überschreiben
Hallo,

ich habe eine Liste abgeleitet und würde jetzt gerne die Eigenschaft Item überschreiben, so dass ich meinen gewünschtes Objekt (vom gewünschten Typ) beim Zugriff auf den []-Operator bekomme.

Wie geht das?

Beispiel:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public abstract class MeineListe: List<MeinTyp>
{

}

public abstract class MeineAbgeleiteteListe: MeineList
{
    //enthält items vom Typ MeinAbgeleiteterTyp, welche geerbt von MeinTyp sind
    //diese möchte ich zurückgeben beim Zugriff über MeineAbgeleiteteListe[]
}


Viele Grüße und herzlichen Dank,
Hans-Peter

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Sa 26.07.2008 um 12:29


Christian S. - Sa 26.07.08 12:34

Hallo!

Wäre es nicht eleganter, eine Klasse für beide Typen zu verwenden? Das ist ja gerade Sinn von Generics ;-)

Könntest Du z.B. so machen (ich kenne die C#-Syntax gerade nicht, musst Du leider nachschlagen)

Oxygene
1:
2:
3:
4:
5:
type
  MeineListe<T> = public class(List<T>)
    where T is MeinTyp;
  public
  end;


Oder ist die Ableitung noch für mehr da, als dass die Items vom richtigen Typ sind? :-)

Grüße
Christian


wulfskin - Sa 26.07.08 12:39

Hallo,

ich mach mich nebenher mal schlau was Generics sind. Mir fehlt viel Theorie rund um die neuen Möglichkeiten im Vergleich zu Delphi (ohne .NET).

Aber es gibt mehrere abgeleitete Listen, die auch andere Dinge machen sollen. Deswegen wäre es nett, wenn du mir trotzdem jemand sagt wie das geht. Ob das dann die richtige Lösung ist, kann ich erst sagen wenn ich Generics verstanden habe.

Viele Grüße und herzlichen Dank,
Hans-Peter


wulfskin - Sa 26.07.08 14:10

Hallo,

hab es jetzt herausgefunden. Das Stichwort dafür heißt Indexer. Sie verhalten sich im Prinzip gleich wie Eigenschaften.

So geht es:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public abstract class MeineAbgeleiteteListe: MeineList
{
    public new MeinAbgeleiteterTyp this[int index] //new weil alter typ versteckt wird
    {
        get
        {
            if (base[index] != null)
                return (MeinAbgeleiteterTyp)base[index];

            else
                return null;
        }

        //set geht analog dazu            
    }
}


Grüße,
Hans-Peter


Kha - Sa 26.07.08 17:03

Christians Tipp mit den Type Constraints (C#-Syntax: where T : MeinTyp) solltest du dir trotzdem noch einmal anschauen. Bei deinem Code müsstest du ja nicht nur den Indexer verdecken, sondern auch alle anderen Methoden. Und mit einem Cast auf die Basisklasse ist die Typsicherheit wieder futsch.