Was ist der Unterschied zwischen NVI ( Nicht-virtuelle Schnittstelle ) und < a href="http://en.wikipedia.org/wiki/Template_method_pattern"> Vorlagenmethode Muster?
Sie scheinen mir sehr ähnlich zu sein und ich habe beide gelesen, dass sie im Grunde genommen die gleichen sind und dass sie sich subtil unterscheiden, da Template irgendwie allgemeiner ist.
NVI ist ein Idiom, Template-Methode ist ein Muster. NVI ist eine Implementierung des Vorlagenmethodenmusters unter Verwendung des dynamischen Versands in C ++; Es ist auch möglich, Vorlagen-Methoden in C ++ zu erstellen, indem die Metaprogrammierung der Vorlage verwendet wird, um den dynamischen Versand zu eliminieren.
Ein Muster ist allgemeiner als ein Idiom, und Sprachen können verschiedene Idiome verwenden, um das Muster zu implementieren.
Wie gesagt wurde, ist NVI eine Programmiersprache, die sich auf eine Kategorie von Sprachen bezieht. Es wurde unter anderem von Herb Sutter gefördert, weil es hilft, Verträge durchzusetzen:
Die Implementierung kann jedoch tatsächlich erheblich abweichen. Ein anderes Beispiel für die NVI-Implementierung ist die Kombination mit Pimpl:
%Vor%Und für die Implementierung:
%Vor%Ich habe immer festgestellt, dass es den Punkt besser vermittelt hat. Hast du es herausgefunden?
Der Hauptpunkt ist, dass virtual
ein Implementierungsdetail ist. Es ist eine schlechte Idee, Implementierungsdetails in der Schnittstelle offenzulegen, weil Sie sie möglicherweise ändern möchten.
Darüber hinaus neigen die Implementierungsdetails dazu, die Binärkompatibilität zu stören. Zum Beispiel kann das Hinzufügen einer neuen virtual
-Methode in einer Klasse das Layout der virtuellen Tabelle (allgemeine Implementierungstechnik) ändern und somit die Binärkompatibilität verpfuschen. Auf gcc müssen Sie sicherstellen, dass Sie es zuletzt (unter den virtuellen) hinzufügen, wenn Sie die Kompatibilität beibehalten möchten.
Wenn Sie die obige Kombination aus NVI + Pimpl verwenden, gibt es in der exponierten Klasse überhaupt kein virtual
(nicht einmal privat). Das Speicherlayout ist rückwärts und vorwärtskompatibel. Wir haben Binärkompatibilität erreicht.
Hier verwenden wir mehrere Muster gleichzeitig:
Tags und Links c++ design-patterns template-method-pattern non-virtual-interface