Autor Beitrag
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Sa 26.07.08 12:15 
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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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)
ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
wulfskin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.