Vererbungsproblem



  • Hallo

    Ich habe ein etwas verzwicktes problem! Ich nutze eine Bibliothek welche mir verschiedene nette Klassen vorgibt welche voneinander abgeleitet sind. Jetzt möchte ich eigene Klassen davon ableiten, allerdings sollen diese ein gemeinsammes, von mir definirtes "Interface" haben, also gleiche Functionen teilen. Meine Idee sieht ungefähr so aus:

    Eigene Klasse ← Bibliotheksklasse 2 oder 3 oder ... ← Bibliotheksklasse 1

    Interfaceklasse

    Da die eigene Klasse von vielen verschiedenen Bibliotheksklassen abgeleitet werden kann, kann ich die Interfaceklasse nicht direct "dazwischen" legen sondern muss sie als zusätzliche Basisklasse nutzen.

    Die verschiedenen Eigenen Klassen werden nun zur laufzeit erzeugt, allerdings kenne ich die genaue Klasse nicht, die Erzeugung wird durch eine art Factory erledigt.

    Nun das Problem: Ich muss einige Funktionen von Bibliotheksklasse 1 verwenden und gleichzeitig auf Funktionen der Interfaceklasse zugreifen!

    wenn ich die klasse so erzeuge:

    Bibliotheksklasse 1 = new Eigene Klasse()
    

    ist es mir nicht möglich die Interfacefunktionen zu nutzen, da ein cast unmöglich scheint.

    Andersherum

    Interfaceklasse = new Eigene Klasse()
    

    kann ich wieder die Funktionen der Bibliotheksklasse nicht verwenden!

    Gibt es eine möglichkeit meine Idee zum laufen zu bekommen oder ist das Design schon ein Fehler in sich?

    Danke für eure Ideen!
    Stefan



  • Was spricht gegen

    EigeneKlasse* Ptr = new EigeneKlasse();
    

    Und du kommst doch sicher von Java, oder? Interfaces sind in C++ nicht so üblich wie in Java. Man kann zwar durch Mehrfachvererbung einiges hinkriegen, aber das ist je nach Fall nicht immer der richtige Weg. Braucht denn deine eigene Klasse so ein Interface zwangsläufig? Wäre eventuell das Adapter-Pattern (oder einfach nur freie Funktionen) eine mögliche Alternative?

    Und in C++ musst du auch aufpassen, dass du Speicher, den du mit new anforderst, wieder selber mit delete freigibst. Aber ein new ist bei Weitem nicht immer nötig.



  • Hallo

    EigeneKlasse* Ptr = new EigeneKlasse();
    

    ist deswegen nicht möglich weil ich zum Zeitpunkt der Erstellung nicht weis welche eigene klasse es ist, es könnten mehrere verschiedene sein! Das ist auch der Grund warum ich das "Interface" benötige, um mit den verschiedenen Eigenen klassen auf standartisierte weise umgehen zu können.

    Ich komme nicht von Java, kenne dort nur die Grundzüge, der Bgriff Interface ist eher rein zufällig gewählt weil er mir passend schien 🙂

    Danke
    Stefan



  • Ich habe eine Lösung gefunden! Mittels c++ RTTI ist ein cast möglich (dynamiv_cast)

    Jetzt kann ich wie folgt vorgehen:

    Bibliotheksklasse1 *bib = new Eigene Klasse;
    
    InterfaceKlasse *inter = dynamic_cast<Interfaceklasse*>bib;
    

    auf diese weise ist es mir möglich alle nötigen functionen zu nutzen!

    Danke für eure Hilfe!
    Stefan



  • Interfaces sind in C++ nicht so üblich wie in Java. Man kann zwar durch Mehrfachvererbung einiges hinkriegen, aber das ist je nach Fall nicht immer der richtige Weg.

    Da bin ich anderer Meinung. In C++ gibt es nur kein eigenes Keyword für eine Schnittstelle, dennoch ist das Konzept (sehr oft) verwendet und sehr sinnvoll.

    Ich würde generell die Unterscheidung machen, und die kann auch in C++ gemacht werden, zwischen Implementationsvererbung und Interface Implementierung.

    Simon



  • Igby schrieb:

    Ich habe eine Lösung gefunden! Mittels c++ RTTI ist ein cast möglich (dynamiv_cast)

    Jetzt kann ich wie folgt vorgehen:

    Bibliotheksklasse1 *bib = new Eigene Klasse;
    
    InterfaceKlasse *inter = dynamic_cast<Interfaceklasse*>bib;
    

    auf diese weise ist es mir möglich alle nötigen functionen zu nutzen!

    Danke für eure Hilfe!
    Stefan

    Das wäre irgendwie entgegen des Substitutionsprinzips.
    Dann mach doch verschiedene Interfaces und verschieden Factories.
    Simon



  • Da hast du recht, schön ist es nicht, allerdings müsste ich ungefähr 10-15 Factories/Interfaces schreiben, das ist mir zu aufwenidg!

    Stefan


Anmelden zum Antworten