Fat interface mit Delegaten vermeiden



  • den sinn verstehe ich zwar auch nicht so ganz, aber so weit ich dich verstanden habe, wäre vererbung vll das richtige:

    class B
    {
    private:
     int n;
    public:
     int GetN() const {return n;}
     void SetN(int _n) {n = _n;}
    };
    
    class C : public B
    {
     public:
      int GetN_and_one() const {return GetN() + 1;}
    };
    
    int main()
    {
     C test;
     test.getN();
     test.getN_and_one();
    }
    

    oder hab ich dich falsch verstanden?

    bb

    edit: oh - hatte vergessen, den tab zu aktualisieren, bevor ich geschrieben hab... sry ><



  • audacia schrieb:

    Du könntest C von B erben lassen - wenn du die Konsequenzen überblickst, und wenn diese Beziehung sinnvoll ist. Ansonsten könntest du in C eine Memberfunktion einführen, die einen Zeiger auf ein B-Objekt zurückgibt.

    Mir ging es darum, ob es neben diesen beiden Möglichkeiten noch eine andere gibt. Vererbung würde ich lieber vermeiden (da die Klassenhierarchie in dem Fall, den ich vor Augen habe, schon kompliziert genug ist). Und ein Zeiger auf ein B-Objekt hat ja den Nachteil, dass ich dann

    C c;
    c.b()->b_1();
    

    statt

    C c;
    c.b_1();
    

    schreiben müsste (wobei b() den Zeiger auf das B-Objekt liefere). Ich dachte an ein Konstrukt, dass mir erlaubt alle member functions eines Delegaten B der Klasse C zu member functions von C zu machen, ohne dass ich die einzeln ins Interface von C schreiben muss, also

    class C
    {
        B* b;
        ...
    public:
        void a_1();
         ...
        void a_m();
    
        use interface of B;    // die Zeile nur so, dass C++ das versteht
    };
    


  • Das geht so, wie du das willst lediglich durch Vererbung.

    Ansonsten musst du halt b public machen, dann geht das:

    C c;
    c.b->b_1();
    

    oder wenn eine Referenz speicherst:

    C c;
    c.b.b_1();
    

    Das ist aber nur zu empfehlen, wenn du wirklich keine Vor/Nachbedingugen hast. Ansonsten kannst du dir ja eine Schnittstelle für B basteln, der dir die Aufrufe wrappt und du so im Nachhinein immernoch relativ leicht eine Vor/Nachbedingung einfügen kannst. (Kommt dann auf das gleiche raus, wie alles in C zu wrappen, ausser, dass es ein wenig aufgeräumter ist.)



  • ich schliesse mich dem vorredner an.
    wobei, damit man nicht andauernd c.b schreiben muss kann man das auch so schreiben

    B& b = c.b();
    
    b.b_1();
    b.b_2();
    b.b_n();
    


  • Was soll "Delegaten" für ein Wort sein? Vielleicht Plural (bzw. 2. Fall Singular) von "Delegat"? Wenn ja, was soll "Delegat" für ein Wort sein?

    Meinst du vielleicht "der Delegierte"? Oder meinst du das englische "delegate" (der Abgeordnete/Abgesandte/Bevollmächtigte/...)? Oder "delegieren" (ich delegiere, du delegierst, der Vorgang des Delegierens)?

    Es ist nicht meine Absicht dich zurechtzuweisen oder zu beleidigen, ich denke nur dass du genauer verstanden wirst wenn du Wörter verwendest die es a) auch gibt und die b) gebräuchlich sind bzw. allgemein verstanden werden.



  • Also, dein Interface ist fett. Egal wie du es nun zerbröckelst, im Grunde willst du es, wie du sagst ja doch zusammenbehalten. Evtl. kannst du dann ja nach einer halben Seite vom Interface einfach jede Menge Leerzeilen einbauen. Damit hast du das eigentlich zusammengehörige auch sehr schon getrennt und total übersichtlich.

    Oder aber du gehst zum Reißbrett und schaust ob wirklich alles Teil des Klasseninterfaces sein muss, oder ob nicht einiges sinnvoll in normale Funktionen ausgelagert werden kann, oder ob nicht doch eine Komposition das Richtige ist.



  • hustbaer schrieb:

    Was soll "Delegaten" für ein Wort sein? Vielleicht Plural (bzw. 2. Fall Singular) von "Delegat"? Wenn ja, was soll "Delegat" für ein Wort sein?

    Meinst du vielleicht "der Delegierte"? Oder meinst du das englische "delegate" (der Abgeordnete/Abgesandte/Bevollmächtigte/...)? Oder "delegieren" (ich delegiere, du delegierst, der Vorgang des Delegierens)?

    Es ist nicht meine Absicht dich zurechtzuweisen oder zu beleidigen, ich denke nur dass du genauer verstanden wirst wenn du Wörter verwendest die es a) auch gibt und die b) gebräuchlich sind bzw. allgemein verstanden werden.

    Hiermit soll gemeint sein, was in "Design Patterns" auf S. 20 unter "Delegation" beschrieben ist: "... a receiving object delegates operations to its delegate". Delegat ist meine Eindeutschung von "delegate". Falls es eine andere Übersetzung gibt, lasst mich es wissen.


  • Administrator

    ingobulla schrieb:

    Hiermit soll gemeint sein, was in "Design Patterns" auf S. 20 unter "Delegation" beschrieben ist: "... a receiving object delegates operations to its delegate". Delegat ist meine Eindeutschung von "delegate". Falls es eine andere Übersetzung gibt, lasst mich es wissen.

    http://dict.leo.org/ende?lang=de&search=delegate
    😉

    Grüssli



  • ingobulla schrieb:

    hustbaer schrieb:

    Was soll "Delegaten" für ein Wort sein? Vielleicht Plural (bzw. 2. Fall Singular) von "Delegat"? Wenn ja, was soll "Delegat" für ein Wort sein?

    Meinst du vielleicht "der Delegierte"? Oder meinst du das englische "delegate" (der Abgeordnete/Abgesandte/Bevollmächtigte/...)? Oder "delegieren" (ich delegiere, du delegierst, der Vorgang des Delegierens)?

    Es ist nicht meine Absicht dich zurechtzuweisen oder zu beleidigen, ich denke nur dass du genauer verstanden wirst wenn du Wörter verwendest die es a) auch gibt und die b) gebräuchlich sind bzw. allgemein verstanden werden.

    Hiermit soll gemeint sein, was in "Design Patterns" auf S. 20 unter "Delegation" beschrieben ist: "... a receiving object delegates operations to its delegate". Delegat ist meine Eindeutschung von "delegate". Falls es eine andere Übersetzung gibt, lasst mich es wissen.

    Übersetzung des englischen Worts ist ja nicht schwer zu finden. Übersetzung des Fachausdruckes kann ich dir keine anbieten. Verwende doch einfach das englische Wort, so wie es unter Programmierern üblich ist. Man sagt auch "callback" oder "exception" - solche Ausdrücke werden selten übersetzt. Wenn du eine Übersetzung kennst die breitflächig verstanden wird kannst du sie gerne verwenden (auch wenn ich es persönlich nicht tun würde). Aber auf Zwang einfach alles ins Deutsche zu übersetzen oder - noch schlimmer - "einzudeutschen" indem man ein nicht-deutsches Wort deutsch dekliniert... finde ich nicht gut.



  • ingobulla schrieb:

    Ich dachte an ein Konstrukt, dass mir erlaubt alle member functions eines Delegaten B der Klasse C zu member functions von C zu machen, ohne dass ich die einzeln ins Interface von C schreiben muss, also

    class C
    {
        B* b;
        ...
    public:
        void a_1();
         ...
        void a_m();
    
        use interface of B;    // die Zeile nur so, dass C++ das versteht
    };
    

    So etwas gibt es, soweit ich weiß, nur in Delphi und nur für Interfaces (implements). In C++ kannst du aber, wenn du nicht dynamic_cast<> benutzt, sondern das dynamische Dispatching selbst implementierst (z.B. mit QueryInterface()), etwas ähnliches erreichen.



  • audacia schrieb:

    In C++ kannst du aber, wenn du nicht dynamic_cast<> benutzt, sondern das dynamische Dispatching selbst implementierst (z.B. mit QueryInterface()), etwas ähnliches erreichen.

    Kennt jemand eine Website, auf der erklärt wird, was QueryInterface ist und wie es funktioniert? Per Google habe ich nichts erhellendes finden können.



  • ingobulla schrieb:

    audacia schrieb:

    In C++ kannst du aber, wenn du nicht dynamic_cast<> benutzt, sondern das dynamische Dispatching selbst implementierst (z.B. mit QueryInterface()), etwas ähnliches erreichen.

    Kennt jemand eine Website, auf der erklärt wird, was QueryInterface ist und wie es funktioniert? Per Google habe ich nichts erhellendes finden können.

    http://msdn.microsoft.com/en-us/library/ms682521(VS.85).aspx

    Soweit ich das aber sehe, ging es vorher aber eher um dynamisches Dispatching:
    http://en.wikipedia.org/wiki/Dynamic_dispatch



  • Abends nicht zuviel essen und immer aktiv sein, dann wird man nicht zu fett.


Anmelden zum Antworten