Design Frage: Objekte von Subklassen erstellen



  • Hallo!
    Ich habe 3 Subklassen einer Basisklasse. Die Bassisklasse enthält alle Attribute und einen Subklassen-Schlüssel.

    class Basis{
      int id;
      string subclass;
    }
    class A:public Basis { A::A():subclass("A"){} };
    class B:public Basis { B::B():subclass("B"){} };
    class C:public Basis { C::C():subclass("C"){} };
    

    Ich möchte jetzt Objekte der Klassen A,B und C in einer Rel-DB speichern.

    class BasisDB {
      bool store ( Basis* sub );
      Basis* restore( int id );
    }
    

    Restore macht in etwa:

    Basis* restore( int id ){
      string classtype=get_subclass_from_id(id);
      if ( classtype="A" ){
        return new A;
      }
      else if ( classtype="B" ){
        return new B;
      }
      else if ( classtype="C" ){
        return new C;
      }
    }
    

    Was mich jetzt stört ist zum einen das BasisDB alle Subklassen kennen muss da Basis sie auch schon kennt - neue Subklasse muss an mehreren stellen eingepflegt werden.
    Ich könnte in Basis eine statische Klassenmethode einfügen die das erzeugen übernimmt. Dann bleibt aber die unschöne if-else konstruktion.
    Hat einer einen schönen Designvorschlag?

    Vielen Dank...
    Peanut

    PS: Kann ein Objekt der Basisklasse sich selbst in ein Subklassen-Objekt "casten"?

    edit: PS angefügt.

    [ Dieser Beitrag wurde am 22.05.2003 um 22:53 Uhr von Peanut editiert. ]



  • Original erstellt von Peanut:
    Was mich jetzt stört ist zum einen das BasisDB alle Subklassen kennen muss da Basis sie auch schon kennt

    Wieso kennt Basis die abgeleiteten Klassen? Sollte eigentlich nicht so sein, bzw. in deinem Beispiel tuts das nicht und ich sehe jetzt auch keine Notwendigkeit dafür. Versuch das mal lieber zu ändern.

    Dort wo die Objekte mit new angelegt werden, müssen die Klassen auf jeden Fall bekannt sein.



  • Original erstellt von DrGreenthumb:
    Wieso kennt Basis die abgeleiteten Klassen? Sollte eigentlich nicht so sein,

    Die Subklassen stellen Benutzerrollen dar die man wechseln kann. In der Basisklasse gibt es eine switchRole Methode und sie enthält ein enum capabilities um prüfen zu können ob die Klasse gewechselt werden darf.
    Es handelt sich um eine CGI-App., daher muss der Rollenwechsel nur gespeichert werden und der nächste Request erfolgt in geänderter Rolle.
    Die Basisklasse reflektiert den gesamten Datenbankeintrag.


Anmelden zum Antworten