IEnumerable und IEnumerator implementieren



  • Guten Abend Forianer,

    ich erkläre mein Problem anhand eines Beispiels.
    Ich habe eine abstrakte Klasse "Auto" und ihre Kindklassen "Bmw", "Audi", "Fiat" und "Saab". Dazu gibt es eine Klasse "Autos", die die besagten Kindklassen in Form von Instanzen als Membervariable und Property besitzt.

    class Autos
    {
      private Bmw myBmw;
      public Bmw MyBmw { get { return myBmw; } }
    
      private Audi myAudi;
      public Audi MyAudi { get { return myAudi; } }
    
      private Fiat myFiat;
      public Fiat MyFiat { get { return myFiat; } }
    
      private Saab mySaab;
      public Saab MySaab { get { return mySaab; } }
    }
    

    Mein Ziel ist es, dass ich die Schnittstellen IEnumerable und IEnumerator so implementiere, dass folgender Code möglich wird.

    Autos autos = new Autos();
    foreach(Auto auto in autos)
    {
      Console.Write(auto.Name) // Name ist ein Property von der Klasse "Auto"
    }
    

    Warum ich das ganze gern so hätte, hat den Grund der dynamischen Erweiterung der Klasse "Autos" um ein weiteres Auto (z.B. Seat). So muss ich bloß das gewünschte Auto hinzufügen und die foreach-Schleife erledigt ihre Aufgabe brav, indem sie halt einen Autonamen mehr ausgibt.

    Wäre sehr dankbar, wenn mir jemand seine Ideen mitteilen würde :-).

    Schönen Abend noch.



  • class Autos : List<Auto>
    {
      // ...
    }
    


  • Warum nicht so?

    List<Auto> autos = new List<Auto>();
    autos.Add(new Bmw());
    autos.Add(new Audi());
    // ...
    foreach(Auto a in autos) {
       Console.WriteLine(a);
    }
    


  • theta schrieb:

    Warum nicht so?

    List<Auto> autos = new List<Auto>();
    autos.Add(new Bmw());
    autos.Add(new Audi());
    // ...
    foreach(Auto a in autos) {
       Console.WriteLine(a);
    }
    

    Diese Idee hatte ich auch schon, bloß besteht ja hier die Möglichkeit, Autos von "außerhalb" (mit List<T>.Add()) der Liste hinzuzufügen, was ich eben verhindern wollte, da nur ich selbst bestimmen möchte, welche Autos in der Liste vorhanden sind!



  • Ja, dann pack die Auto Instanzen innerhalb der Klasse Autos in ein Array oder ähnlich und dann implementierst Du IEnumerable.

    Simon



  • Dafür gibt's doch ReadOnlyCollection<T>... nücht?


Anmelden zum Antworten