Klassenentwurf: auf Elemente der übergeordneten Klasse zugreifen



  • Hallo zusammen,

    ich komme immer wieder mal in die Verlegenheit, dass ich aus einer Klasse auf Elemente der übergeordneten Klasse zugreifen will.

    Bsp.:

    class K1()
    {
    int A1;
    f1() // irgendeine Methode
    K2 B1 // K1 beinhaltet also K2
    }

    class K2()
    {
    int A2;
    f2() // irgendeine Methode
    }

    Klasse K1 hat also ein Element B1 vom Typ K2.
    Nun möchte ich gerne in f2() auf A1 zugreifen. Gibt es hierfür einen "empfohlenen" Weg?

    Meine Lösung erweckt in mir immer den Eindruck schlechter Stil, bzw. ein Workaround zu sein. Ich lege in solchen Fällen in K2 eine Variable vom Typ *K1 an und trage im Konstruktor von K1 dort dessen Adresse ein. Dann habe ich über diesen Pointer Zugrff auf Elemente von K1.

    Was ist hier der ästhetische Weg?

    Gruß

    Martin



  • Membervariablen sollten immer private sein. Immer! Mach eine Funktion in der Basisklasse, die A1 zurückgibt, aber tu mir den Gefallen und nenne sie nicht "getA1". (Siehe anderer Thread 😃 )



  • martin_b schrieb:

    Klasse K1 hat also ein Element B1 vom Typ K2.
    Nun möchte ich gerne in f2() auf A1 zugreifen. Gibt es hierfür einen "empfohlenen" Weg?

    Nein. Zumal ein K2 dem Desing nach nicht unbedingt mit einem K1 verbunden sein muss. Es wäre sogar möglich, eine Menge K2s zu haben, ohne jemals ein K1 zu erzeugen.

    Du musst dem K2 also irgendwie mitteilen, auf welchen K1 er zugreifen soll, entweder "fest" als Klassenvariable und Übergabe im Konstruktor, oder nur beim Aufruf von f2() als Parameter. Zusätzlich musst du dem K2 eine Möglichkeit geben, den Wert des A1 in K1 zu ermitteln bzw. zu ändern (je nachdem).

    Vielleicht ist aber auch ein ganz anderes Design angebracht. Leider hast du uns nur Beispielcode geliefert, ohne zu sagen, was du damit erreichen willst, und ohne zu zeigen, wie der Code denn nun wirklich aussieht. Lies zu dem Thema bitte auch den Link in meiner Signatur.



  • Hallo,

    zunächst einmal herzlichen Dank an Euch beide für die Antworten.

    @314159265358979 natürlich mache ich meine Membervariablen private. Get und Set brauche ich nicht - ich verwende RAD-Studio (ehem. Borland C++ Builder) da gibt es properties. Aber das war ja auch gar nicht das Thema.

    @pumuckl
    Also ist die Lösung irgendwo einen Zeiger zu setzen (Parameter, Member oder Klassenvariable) nicht so unschön, wie mir es immer erscheint. Dann bin ich jetzt zwar nicht wirklich schlauer, aber das schlechte Gefühl ist weg. 🙂

    Der Mini-Code sollte nur das Problem skizzieren, das ich schon in vielen Anwendungen hatte. Die wirklichen Codebeispiele wären viel Umfangreicher gewesen. Codebeispiele möglichst klein zu halten wird ja auch in Deinem Link empfohlen.

    Möglicherweise würde in einigen Fällen ein anderer/besser Klassenentwurf das Problem an sich beseitigen.

    Danke jedenfalls nochmals für Eure Meinung.

    Gruß

    Martin



  • martin_b schrieb:

    Get und Set brauche ich nicht - ich verwende RAD-Studio (ehem. Borland C++ Builder) da gibt es properties.

    Bitte erklärs mir. Warum verwendet man nicht-Standard Erweiterungen. Ich verstehe es nicht. Das macht den Code nur unportabel.



  • martin_b schrieb:

    Get und Set brauche ich nicht - ich verwende RAD-Studio (ehem. Borland C++ Builder) da gibt es properties.

    Gerade bei Properties sollte man Getter und Setter verwenden 😮



  • Bitte erklärs mir. Warum verwendet man nicht-Standard Erweiterungen. Ich verstehe es nicht. Das macht den Code nur unportabel.

    Wenn portierbarkeit ein Thema wäre hättest Du natürlich vollkommen Recht. Aber ich verwende ohnehin auch massiv die VCL-Komponenten, da ist das Thema Portierbarkeit eh gegessen.

    Gruß

    Martin



  • MichelRT schrieb:

    Gerade bei Properties sollte man Getter und Setter verwenden 😮

    Wenn sich durch das lesen/schreiben etwas in der Klasse ändert - ja.

    Aber beim einfachen lesen/schreiben eines Variablenwertes kann man im Property aber direkt auf die Variable zugreifen:

    private:
    bool FdrawBackground;
    [...]
    __property bool drawBackground = {read = FdrawBackground, write = FdrawBackground};
    

    Aber das gehört jetzt vermutlich schon bald ins BCB-Forum.

    Gruß

    Martin


Anmelden zum Antworten