Private Interface



  • Hi,

    ich habe ein Interface, dass ich global sperren können möchte. Dazu habe ich mir überlegt, für das Sperren ein eigenes Interface zu definieren, von welchem ich mein eigentliches Interface ableite. Da ich die Sperrfunktion nur global brauche, soll die in meinem eigentlichen Interface nicht zu sehen sein - ich leite also privat ab. Die frage ist, ob ich denn dann über den Sperr-Interface-Pointer an die Sperrfunktion noch dran komme. Ein erster Test sieht vielversprechend aus, logisch find ich es aber nicht. Hier der Beispielcode, dann wird's verständlicher:

    class IfGlobalLock {
    protected:
      static bool locked = false;
    
    public:
      void setLock(bool _lock) { locked = _lock; }
      bool getLock() { return locked; }
    };
    
    class IfMyInterface : private IfGlobalLock {
    public:
      virtual IfMyInterface() {};
      virtual ~IfMyInterface() {};
      virtual void operation() = 0;
    };
    
    class MyClass : public IfMyInterface {
      bool operation() {
        if (locked) {
          return false;
        } else {
          return true;
        }
      }
    };
    
    void main() {
      MyClass myObjA;
      MyClass myObjB;
      MyClass myObjC;
      IfGlobalLock *globalLock;
      bool result = false;
    
      result = myObjA.operation();  // returns true
      result = myObjB.operation();  // returns true
      result = myObjC.operation();  // returns true
    
      globalLock = &myObjA;
      globalLock->setLock(true);
    
      result = myObjA.operation();  // returns false
      result = myObjB.operation();  // returns false
      result = myObjC.operation();  // returns false
    }
    


  • Hallo,

    zunächst 2 Anmerkungen:
    - Ein Konstruktor kann nicht virtual sein (kompiliert das!?)
    - Der Destruktor sollte in der Basisklasse IfGlobalLock virtual sein

    Den Sinn der IfGlobalLock-Klasse als Basisklasse verstehe ich überhaupt nicht.
    Wozu ist das eine Basisklasse? Die Ableitungen könnten ja auch so das Flag abfragen.
    Auch die Standard-Fragen 'ist ein?' und 'ist implemtiert wie?' würde ich eher verneinen.
    Und was ist jetzt die Frage? Warum "globalLock->setLock(true);" funktioniert?
    Warum sollte das nicht funktionieren?



  • Der Code compiliert hier (mit Clang) überhaupt nicht. Da sind ein Haufen kleiner Fehler drin. Welchen Compiler benutzt du?



  • Ich muss gestehen, ich hab da noch etwas nachgefummelt, da sind ein paar Copy-Paste Fehler rein gekommen. Aber das Prinzip wird deutlich.
    Sinn dieses Konstruktes ist, dass setLock vor den Nutzern von IfMyInterface zu verbergen. Weil nicht jeder locken können soll, sondern nur einer global. Natürlich kann jeder über diesen Mechanismus auch an setLock dran kommen, aber es ist eben nicht (offensichtlich) in IfMyInterface enthalten...



  • heimchen schrieb:

    Sinn dieses Konstruktes ist, dass setLock vor den Nutzern von IfMyInterface zu verbergen.

    Dann sollte aber MyClass von IfMyInterface und IfGlobalLock erben. So wie es jetzt ist bringt es gar nichts, da man über das IfMyInterface genauso Zugriff auf deine lock Funktionen hat.

    heimchen schrieb:

    Weil nicht jeder locken können soll, sondern nur einer global.

    Was genau heißt global? In deinem Code ist die locked Einstellung eine static Variable. Ist das absicht? Sollen alle Objekte gelocked werden oder pro Objekt?



  • Alle Objekte über einen Zugriff - also static ist Absicht.

    IfMyInterface ist ein generisches Interface und wird sehr häufig verwendet. Es soll aber immer die Lock-Funktion enthalten. Darum wäre die Variante mit von beiden Erben nicht so schön...


Anmelden zum Antworten