Es gibt ein weniger gebräuchliches C ++ - Idiom, das ich in der Vergangenheit einige Male gut genutzt habe. Ich kann mich einfach nicht daran erinnern, ob es einen allgemein gebräuchlichen Namen hat, um es zu beschreiben.
Es ist etwas verwandt mit Mixins , CRTP und type-radierung , ist aber nicht speziell irgendwelche dieser Dinge.
Das Problem liegt vor, wenn Sie einer Klasse einige Implementierungen hinzufügen möchten, aber Sie möchten nicht in die Klasse oder eine davon abgeleitete Klasse einfügen. Ein Grund dafür könnte sein, dass die Klasse Teil einer Vererbungshierarchie sein könnte, in der die Implementierung nur einmal stattfinden sollte.
Wenn man im Moment Dinge wie die Frage berücksichtigt, ob eine Hierarchie konkrete Nicht-Blatt-Klassen haben soll oder ob die virtuelle Vererbung in einigen Fällen eine Option sein könnte, weiß ich, dass es eine Lösung gibt, die Implementierung in einer Template-Klasse bereitzustellen Das ergibt sich aus seinem Template-Parameter. Dies ermöglicht Ihnen dann, die Vorlage zu verwenden, wenn Sie eine Instanz erstellen, aber dann das Objekt immer nur per Zeiger oder Verweis auf eine seiner Basen verwenden (dort kommt die Art des Löschens im lockeren Sinne vor).
Ein Beispiel könnte sein, dass Sie eine aufdringliche Referenzzahl haben. Alle Ihre Klassen werden von einer ref count-Schnittstelle abgeleitet, aber Sie möchten nur, dass die ref-Zählung selbst und die Implementierung Ihrer ref count-Methoden einmal angezeigt werden. Sie werden also in die abgeleitete Vorlage eingefügt - nennen wir sie ImplementsRC<T>
. Jetzt können Sie eine Instanz wie folgt erstellen:
Ich beschönige Dinge wie das Weiterleiten von Konstruktoren, die aus mehreren Vorlagen-Überladungen usw. bestehen.
Also, hoffentlich habe ich klar gemacht, was das Idiom ist. Nun zurück zu meiner Frage - gibt es einen akzeptierten oder zumindest allgemein gebräuchlichen Namen für dieses Idiom?
Ich würde das definitiv als Mixing bezeichnen, genauso wie Bruce Eckel ( Ссылка ) ).
Meiner Meinung nach ist eines der Dinge, die dies zu einem Mixin machen, dass es immer noch eine einzelne Vererbung ist, was sich von der Verwendung von MI unterscheidet, um etwas Ähnliches zu erreichen.
Es ist eine interessante Idee. Allerdings werde ich Ihnen hier nicht den Namen eines bereits etablierten Musters geben, im Gegenteil werde ich (etwas) erklären, warum ich nicht glaube, dass es schon eins hat.
Was macht es?
Es ist ein sehr schöner Weg, die schreckliche Diamantenvererbung zu vermeiden.
Da es hinsichtlich des Zwecks der Methode einige Verwirrung gibt, möchte ich erläutern, warum ich denke, dass dies der Zweck ist:
%Vor% Jetzt haben wir hier ein Problem. Wenn wir die Implementierung von RefCounted
direkt in diese Klasse einfügen, wird sie zu einer Basisklasse anstelle einer Schnittstelle, und daher müssen wir eine virtuelle Vererbung verwenden oder die Datenelemente werden dupliziert (in B und C vorhanden).
Die Idee ist also, die Implementierung bis zum letzten Moment zu verschieben.
Vorteile:
Unbequem:
Beispiel für die Bereitstellung:
%Vor%Wie lautet der Name?
Ich kann mir nichts vorstellen, was genau zu diesem passt. Bridge und Decorator wurden erwähnt, aber das ist etwas ganz Besonderes und in der Tat nicht so OO-orientiert (zum Beispiel wird es nicht in Java passieren, da du keine Multi-Vererbung hast), also bezweifle ich, dass der Begriff gefunden wird im GoF-Buch.
Auch ist es nicht wirklich das CRTP, weil es eine Art Schleife im CRTP gibt (die Basis kennt die abgeleitete Klasse), die hier nicht vorkommt & gt; wir sind tatsächlich streng linear!
Und dann ist es sicherlich nicht das Pimpl-Idiom, das vorschlägt, die Implementierung vom Client weg zu verstecken, während man eine Vorlage für die Implementierung benutzt, um sie einfach ins Gesicht zu werfen! (Die Vorlage könnte jedoch Pimpl als internes Detail verwenden)
Ich schlage Demut jiti für Just In Time Implementierung vor, was den Titel irgendwie nachahmt, aber näher an dem Punkt ist, denke ich, Herleitung hier ist nur ein Werkzeug und nicht ein Ziel.
Interessante Idee jedenfalls.
Ich bin mir nicht sicher, ob das einen Namen hat, da GF vorgeschlagen hat, dass es ein bisschen wie das Brückenmuster aussieht. Es ist fast so, als würde man die Funktionalität an die Basisklasse anpassen.
Ich schlage einen neuen Namen dafür vor, den Zuhälter Idiom. Wie Sie Ihre Basisklasse pimpen;)
Suchen Sie nach dem Dekorationsmuster ?
Grundsätzlich ist der Dekorator ein Objekt, das ein anderes Objekt umschließt und die Funktionalität bestimmter Methoden erweitert. Die Methodenaufrufe werden dann an die beiliegende Methode weitergeleitet.
Wenn Sie sich Ihr Referenzzählungsbeispiel anschauen, können Sie sich etwas mit CComObject & lt; & gt; Dies ist eine der wenigen Vorlagenklassen, die ATL enthält, um die Implementierung von IUnknown bereitzustellen. Es verwendet auch Richtlinienklassen, um das Verhalten zu variieren. Natürlich ist das Signal-Rausch-Verhältnis, das Google über das Konzept von CComObject versucht, sehr gering, weil es so ubiquitär ist. Dieser MSDN-Artikel kann Ihnen weitere "Schlüsselwörter" geben, um die Suche zu erleichtern.
[NB: Nur um klar zu sein - ich schlage nicht vor, dass er CComObject verwendet, ich schlage vor, dass es ein anderes populäres Beispiel desselben Konzepts ist und daher möglicherweise in einem Musterbuch referenziert wurde oder Artikel]
Sieht aus wie Pimpl idiom ? Vielleicht auf eine ungewöhnliche Art und Weise verwendet.
Beantworte meine eigene Frage. Erstes Zeichen des Wahnsinns? - nein, davor gab es mehrere Zeichen; -)
Wie auch immer, es ist so lange her, seit ich ursprünglich geschrieben habe, dass ich mehr oder weniger eine andere Person bin.
Ich habe festgestellt, dass ich mich auf den Namen mixover festgelegt habe. Ich habe festgestellt, dass dies sehr gut passt und als eine Verfeinerung des Mixins betrachtet werden kann, anstatt das allgemeinere Konzept zu verwenden.
Ich habe sie in letzter Zeit sehr oft benutzt, also dachte ich, ich würde zurückkommen und diesen Thread aktualisieren.
Tags und Links c++ idioms mixins type-erasure crtp