none
Flexible Composite Struktur RRS feed

  • Frage

  • Hallo,
    ich muss Produktnummern übermitteln.
    Dabei kann es verschiedene Konstellationen geben.
    z.B. so.
     <Composite start="13" end="10" g1="2" g2="3" >
    oder
     <Composite start="13" end="10" g1="2">
     ich lese das, g2 gibt es nicht, also null
    <start>Produkt1<g1><g2>Produkt2<g1><g2>Produkt3<g1><g2><end>
    Start,[Inhalt]GruppeAnfang,GruppeEnde,Ende   
    Die Verpackung kann unterschiedlich sein.
    Idee
      Interface
      Wenn Wert 0, null ist, wird es ausgelassen.
     
    Somit wäre man flexibler.
    Kann mir jemand bitte Ideenansätze liefern?
    Zum Schluß gehe ich die Liste durch und der Gesamtstring passt.

    Danke und Grüße Sandra

    public interface IEntry
    {
    	String ToString();
    }
    
    public class HandoverhandlingList<T> : List<T> where T : IEntry
    {
    
    	public HandoverhandlingList()
    	{
    
    	}
    
    	public bool Add(T input)
    	{
    		if (input != null)
    		{
    			base.Add(input);
    			return true;
    		}
    		return false;
    	}
    }
    
    public class Start : IEntry
            {
                public Start() { }
    
                public Start(String content)
                {
                    this.Content = content;
                }
    			
    			
    			
    
    public void Fill(int side, string content)
    {
    	switch (side)
    	{
    		case 1:
    			if (ListProduct1.Count == 0)
    				ListProduct1.Add(new Start("13"));
    
    			ListProduct1.Add(new G_Start(null));   // sollte nicht in die Liste rein, weil der Configwert null ist.
    			ListProduct1.Add(new Data(content));
    			ListProduct1.Add(new G_End("G2"));
    			break;
    		case 2:
    			ListProduct2.Add(new Data(content));
    			break;
    	}
    }

    Freitag, 17. März 2017 16:33

Antworten

  • Hallo Sandra,

    Hier ist ein Beispiel, wie Du mithilfe des new-Modifizierers die geerbte Methode ausblenden kannst:

        public class Car
        {
            public void ShowDetails()
            {
                System.Console.WriteLine("An ordinary car.");
            }
        }
    
        public class ConvertibleCar : Car
        {
            public new void ShowDetails()
            {
                System.Console.WriteLine("A roof that opens up.");
            }
        } 
    
        class Program
        {
            static void Main(string[] args)
            {
                ConvertibleCar cc = new ConvertibleCar();
                cc.ShowDetails(); //"A roof that opens up."
                Car Auto = new ConvertibleCar();
                Auto.ShowDetails(); //"An ordinary car."
            }
        }
    

    Wenn Du mit dem so deklarierten Auto die ShowDetails-Methode der abgeleiteten Klasse aufrufen möchtest, kannst Du die Methode überschreiben:

        public class Car
        {
            public virtual void ShowDetails()
            {
                System.Console.WriteLine("A usual car that does not open up.");
            }
        }
    
        public class ConvertibleCar : Car
        {
            public override void ShowDetails()
            {
                System.Console.WriteLine("A roof that opens up.");
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                ConvertibleCar cc = new ConvertibleCar();
                cc.ShowDetails(); //"A roof that opens up."
                Car Auto = new ConvertibleCar();
                Auto.ShowDetails(); //"A roof that opens up."
            }
        }
    

    Ich führe den relevanten Auszug aus dem Artikel an (bcdc entspricht Auto im obigen Beispiel):

    Mit dem override-Modifizierer kann bcdc auf die Method1-Methode zugreifen, die in DerivedClass definiert ist. In der Regel ist das das gewünschte Verhalten in Vererbungshierarchien. Sie möchten, dass Objekte, die über Werte verfügen, die von der abgeleiteten Klasse erstellt werden, die Methoden verwenden, die in der abgeleiteten Klasse definiert sind. Sie erzielen dieses Verhalten, indem Sie override verwenden, um die Basisklassenmethode zu erweitern.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert Sandra Bauer Mittwoch, 29. März 2017 16:39
    Montag, 27. März 2017 07:07
    Moderator

Alle Antworten

  • Hallo Sandra,

    Erbt die Klasse G_Start von Start? Wenn dem so ist, so erzeugt folgende Zeile eine Instanz, deren Content-Eigenschaft null ist:

    ListProduct1.Add(new G_Start(null));

    Wenn G_End und Data ebenfalls von Start erben, würdest Du es mit folgendem Codeausschnitt versuchen? (Ich gehe davon aus, dass Content eine public Eigenschaft der Klasse Start ist; gib bitte Bescheid, wenn ich mich geirrt habe.)

           public bool Add(T input)
             {
                Start s = input as Start;   //es wird auch überprüft, ob die Content-Eigenschaft null ist
                if ((input != null) && (s != null) && (s.Content != null))
                {
                    base.Add(input);
                    return true;
                }
                return false;
             }

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 21. März 2017 07:21
    Moderator
  • Wenn G_End und Data ebenfalls von Start erben, würdest Du es mit folgendem Codeausschnitt versuchen? (Ich gehe davon aus, dass Content eine public Eigenschaft der Klasse Start ist; gib bitte Bescheid, wenn ich mich geirrt habe.)

    Hallo Dimitar,
    public new bool Add(T input)
    {
    Start s = input as Start;   //es wird auch überprüft, ob die Content-Eigenschaft null ist
    if ((input != null) && (s != null) && (s.Content != null) && && (s.Content != "")) )
    {
     base.Add(input);
     return true;
    }
    return false;
    }

    vielen Dank, alles richtig erkannt, so benötige ich es.
    Der Compiler schlug noch new vor.
    So ganz klar ist mir das nicht.
    Weil ich nicht richtig override (ableiten) schreiben kann?

    new geht das in die Performance ein?

    public class HandoverhandlingList<T> : List<T> where T : IEntry
    Viele Grüße Sandra

    Dienstag, 21. März 2017 17:40
  • Hallo Sandra,

    Der new-Modifizierer blendet die gleichnamige Methode der geerbten Basisklasse aus, in Deinem Fall die List<T>.Add-Methode. Für weitere Informationen sieh Dir folgenden Artikel an:
    Wann müssen die Schlüsselwörter "override" und "new" verwendet werden? (C#-Programmierhandbuch)

    Ich führe der Übersichtlichkeit halber den relevanten Auszug aus dem Artikel an:

    Durch Verwenden von new bestätigen Sie, dass Ihnen klar ist, dass der ändernde Member einen aus der Basisklasse geerbten Member ausblendet.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 22. März 2017 14:47
    Moderator
  • Hallo Dimitar,
    ist ja tricki.
    Ich habe eine abgeleitete Klasse.
    Überschreibe die ShowDetails mit new
    Rufe diese auf, dann wird die Basis herangezogen.
    class ConvertibleCar : Car  
    {  
        public new void ShowDetails()  
        {  
            System.Console.WriteLine("A roof that opens up.");  
        }  
    }  

    Wie würde ich dann die ShowDetails aufrufen, damit
    die Ausgabe ("A roof that opens up."); 
    kommt.

    OK mit explizit dem Typen.
     ConvertibleCar car2 = new ConvertibleCar();

    Auf das ganze bin ich ja nur gestoßen, weil ich Add nicht ableiten konnte.
    Der praktische Bezug fehlt mir etwas.
    Vielleicht hast Du noch was.

    Den Unterschied habe ich so schon verstanden, der Nutzen weniger. Hast Du evtl. einen prakt. Bezug?

     
    Viele Grüße Sandra
    Samstag, 25. März 2017 12:29
  • Hallo Sandra,

    Hier ist ein Beispiel, wie Du mithilfe des new-Modifizierers die geerbte Methode ausblenden kannst:

        public class Car
        {
            public void ShowDetails()
            {
                System.Console.WriteLine("An ordinary car.");
            }
        }
    
        public class ConvertibleCar : Car
        {
            public new void ShowDetails()
            {
                System.Console.WriteLine("A roof that opens up.");
            }
        } 
    
        class Program
        {
            static void Main(string[] args)
            {
                ConvertibleCar cc = new ConvertibleCar();
                cc.ShowDetails(); //"A roof that opens up."
                Car Auto = new ConvertibleCar();
                Auto.ShowDetails(); //"An ordinary car."
            }
        }
    

    Wenn Du mit dem so deklarierten Auto die ShowDetails-Methode der abgeleiteten Klasse aufrufen möchtest, kannst Du die Methode überschreiben:

        public class Car
        {
            public virtual void ShowDetails()
            {
                System.Console.WriteLine("A usual car that does not open up.");
            }
        }
    
        public class ConvertibleCar : Car
        {
            public override void ShowDetails()
            {
                System.Console.WriteLine("A roof that opens up.");
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                ConvertibleCar cc = new ConvertibleCar();
                cc.ShowDetails(); //"A roof that opens up."
                Car Auto = new ConvertibleCar();
                Auto.ShowDetails(); //"A roof that opens up."
            }
        }
    

    Ich führe den relevanten Auszug aus dem Artikel an (bcdc entspricht Auto im obigen Beispiel):

    Mit dem override-Modifizierer kann bcdc auf die Method1-Methode zugreifen, die in DerivedClass definiert ist. In der Regel ist das das gewünschte Verhalten in Vererbungshierarchien. Sie möchten, dass Objekte, die über Werte verfügen, die von der abgeleiteten Klasse erstellt werden, die Methoden verwenden, die in der abgeleiteten Klasse definiert sind. Sie erzielen dieses Verhalten, indem Sie override verwenden, um die Basisklassenmethode zu erweitern.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert Sandra Bauer Mittwoch, 29. März 2017 16:39
    Montag, 27. März 2017 07:07
    Moderator