Informationen richtig kapseln



  • Hallo zusammen,

    ich habe gerade das Problem, dass ich nicht genau weiß, wie ich Informationen richtig gruppieren soll. Folgende Situation:

    Ich muss Informationen abbilden, die in einer festgelegten Hierarchie existieren.
    Es gibt Gruppen, die wiederum Unterelemente beinhalten. Ich muss sowohl für die Gruppen, als auch für dessen Unterelemente mehrere Informationen abspeichern. Es gibt ca. 9 Gruppen mit entsprechend 10 Unterelementen.

    Ein Beispiel:

    Gruppe_1: (Position und Text der Gruppe)
    |_ Unterelement_1
    |_ Position
    |_ Text
    |_ Unterelement_2
    |_ Position
    |_ Text
    |_ Unterelement_3
    |_ Position
    |_ Text
    |_ ...

    Ich weiß jetzt nicht genau, mit welchen Datenstrukturen ich diese Hierarchie am besten abbilden soll?

    Soll ich dazu "structs" ineinander schachteln

    struct Gruppe_1
    {
       public: 
    
       Gruppe_1()
       {
           iPosition = 5;
           sText = "Text";
       }
    
       struct Untergruppe_1
       {
          public:
    
          private: 
       }
    
       struct Untergruppe_2
       {
          public:
    
          private: 
       } 
    
       private:
    
       int iPosition;
       AnsiString sText;
    }
    

    oder soll ich Klassen benutzen?
    Des Weiteren habe ich das Problem, dass ich all diese Informationen eigentlich zweimal benötige. Zum einen benötige ich Informationen, um die Anzeige-Komponente richtig initialisieren und anzeigen zu können. Das sind wie oben gezeigt, Positionsangaben etc. Weiterhin benötige ich die Informationen aber auch, um die Werte zu verwalten, die über die Anzeige-Komponente eingegeben werden. Wenn ich also die Informationen logisch trenne, dass ich z.B. eine Klasse hätte, die nur für die Anzeige zuständig ist und eine Klasse, die nur für die interne Datenverwaltung, dann würde in beiden Klassen die Hierarchiestruktur existieren, was wiederum redundant ist.

    Wie kann ich eine abstrakte Klasse erzeugen, die mir die Struktur (ohne Werte- oder Anzeigeinformationen) abbildet, die ich dann über Vererbung in anderen Klassen nutzen kann?

    Vielen Dank für eure Hilfe!!!



  • Hallo

    Zunächstmal : Der Unterschied zwischen struct und class ist in C++ marginal und eher formaler als technischer Natur.

    Ich verstehe deine Beschreibung so :

    // Kleinster Teil : ein Element
    class Element
    {
      ...
      int Position;
      AnsiString Text;
    };
    
    // Erweiterung des Normalen Elements, damit es noch Unterelemente aufnehmen kann
    class Group : public Element
    {
      ...
      std::vector<Element> UnterElemente;
    };
    

    Damit erreichst du eine Datenstruktur Gruppe, die sowohl die Eigenschaften von Element hat, als auch selber eine Anzahl von Element beinhalten kann

    bis bald
    akari



  • Danke schon mal akari!

    Ich hätte noch ein paar kleine Fragen dazu... hoffe ich kann es gut erklären. Also...

    Ich kann mit deiner Konstellation ja eine Datenstruktur "Gruppe" anlegen, die entsprechend viele Unterelemente besitzt. Ich habe nun aber den Fall, dass die Unterelemente einmal nur die Informationen für die Anzeige und einmal nur für die Werteverwaltung speichern sollen. Muss ich dann nochmals eine zweite Datenstruktur z.B. "Gruppe_1" anlegen, oder gibt es eine bessere Möglichkeit?

    // Kleinster Teil : AnzeigeInformationen
    class AnzeigeInformationen
    {
      ...
      int Position;
      AnsiString Text;
    };
    
    // Kleinster Teil : AnzeigeInformationen
    class WerteInformationen
    {
      ...
      int Wert;
      bool isEnable;
    };
    
    // Klasse zum Verwalten der Anzeigeinformationen
    class GroupAnzeige : public AnzeigeInformationen
    {
      ...
      std::vector<AnzeigeInformationen> UnterElemente;
    }; 
    
    // Klasse zum Verwalten der Werteinformationen
    class GroupWerte : public WerteInformationen
    {
      ...
      std::vector<WerteInformationen> UnterElemente;
    };
    

    Weil mit dieser Variante hätte ich das Problem, dass sich die Klassen "GruppeAnzeige" und "GruppeWerte" vom Aufbau her sehr ähneln. Man hat sozusagen die Informationen doppelt hinterlegt, was ich lieber eleganter lösen möchte.

    Dann stellt sich für mich noch die Frage, wie ich in der abgeleiteten Klasse "GruppeAnzeige" ein UnterElement mit zusätzlichen Informationen austatten kann?
    Also wenn z.B. ein Unterelement neben den Eigenschaften von "AnzeigeInformationen" z.B. noch ein

    int Hoehe;
    

    benötigt. Wie kann ich die vorhandenen Eigenschaften sozusagen erweitern?
    Kann ich in diesem Zusammenhang auch "structs" erweitern?

    Z.B.:

    class Basis
    {
    protected:
    
       struct sTest
       {
          int i;
       }test;
    }
    
    class Erweitert : public Basis
    {
    public:
       //Wie könnte ich die Struktur "sTest" um weitere Elemente erweitern???
    }
    

    Vielen Dank für die Hilfe.


Anmelden zum Antworten