Probleme bei Vererbung( falsche property wird benutzt)



  • Ich habe ein Problem bei der Vererbung das ich alleine nicht zu lösen schein.

    Deklarationen der Klassen:

    class basis_cl : public TImage
    {
    public:
       DynamicArray<TPicture> img_obj;
     .
     .
     .
       void set_img_obj(TControl *aOwner);
       void set_parent(TWindControl aParent);
    }
    

    von dieser Basis-Klasse wird das Child abgeleitet

    class child_cl : public basis_cl
    {
    public:
       DynamicArray<myCMSimage> img_obj;
     .
     .
     .
       void set_img_obj(TControl *aOwnert);
    }
    

    Wichtig dabei ist, das die property img_obj nun nicht mehr die VCL Klasse TPicture trägt, sondern eine davon abgeleitet eigen VCL-Klasse myCMSimage, welche ein paar veränderte und neu Methoden beinhaltet.

    die Implementation der MEthode void set_img_obj(TWinControl *Parent); sieht dabei wie folgt aus :
    (In child_cl.cpp)

    void child_cl::set_img_obj(TControl *aOwner)
    {
     this->img_obj.Length++;
     this->img_obj[this->img.obj.High] = new myCMSimage(aOwner);
     .
     .
     .
    
    }
    

    Dies schein auch zu funktionieren, die Propert img_obj von child_cl wird gesetzt.

    Das Problem ist aber, dass die anderen Methoden von basis_cl, die mit img_obj arbeiten, immer nur auf die Property von basis_cl::img_obj zugreifen, und nicht auf die child_cl:img_obj.
    basis_cl::img_obj ist dabei natürlich immer leer, da es ja nie gesetz wird.

    Beispielmethode von basis_cl void set_parent(TWindControl aParent);

    void basis_cl set_parent(TWindControl aParent)
    {
     for(int i=0; i < this->img_obj.Length)
     {
      this->img_obj[i]->Parent = aParent;
    
     } 
    
    }
    

    Somit versuchen also die vererbten Methoden von basis_cl immer nur die eigene img_obj property zuzugreifen, nicht aber die von child_cl überschriebene img_obj.

    Die Frage letzendlich :
    Wie schaffe ich es, die methoden von basis_cl so zu deklarieren bzw. child_cl so abzuleiten(img_obj zu overloaden), dass die vererbten Methoden von basis_cl auf die overloadete img_obj zugreifen ? Ich möchte dabei aber nicht den Weg gehen, z.B. die set_parent methode nochmals in child_cl zu deklarieren. Dies Funktioniert zwar, wiederspricht aber jeder Logik und der Prinzipien der Objekt-Struktur.

    Ich hoffe ich konnte es verständlich formulieren.

    Danke im voraus

    maYer



  • Hallo

    du mußt DynamicArray<myCMSimage> img_obj weglassen. So etwas funktioniert meines Wissens nicht.
    Mein Vorschlag lautet : Das Basis-Array in private verlegen und erstmal passende Getter und Setter dafür schreiben.
    Dann in der Abgeleiteten Klassen neue Getter und Setter erstellen, die mit myCMSimage arbeiten. In diesen Funktionen greifst du dann auch die Basis-Getter zurück, wobei du entsprechend castet.

    bis bald
    akari


Anmelden zum Antworten