2012-10-16 10 views
5

Ich habe eine Frage zu einem Code, den ich kürzlich in meinen Händen genommen habe. Ich will nur wissen, ob in C++ Vorlagen Paradigma es richtig oder sinnvoll ist, die folgende Vererbung zu tun (nur 3 Klassen als Beispiel):Vererbung von einer Vorlage C++


template< class I, class P, class D, unsigned int ID = 0 > 
class PathFilter : public Filter< I, P, 1 > 
{ 
... 
} 

template< class I, class A, unsigned int N = 1 > 
class Filter : public Algorithm< I, A > 
{ 
... 
} 

template< class I, class A > 
class Algorithm : public A //This line 
{ 
    ... 
} 

Meine Frage bezieht sich speziell auf die Vererbung im dritten Beispiel. Ist es sinnvoll, es so generisch und nicht präzise zu machen? Es ist eine gute Wahl, verständlichen Code durch einen allgemeineren Code zu kompromittieren?

Ich frage erstens, weil ich kein Experte für C++ - Vorlagen bin, aber auch, weil ich diesen Code mit Hilfe von Templates schwer zu verstehen finde (normalerweise sagen die Namen der Templates nichts über den Inhalt aus). Irgendein Rat?

Antwort

2

Was Sie tun, ist eine Mixinklasse (insbesondere Ihre Klasse Algorithm ist die eine).

Als Referenz können Sie zum Beispiel http://en.wikipedia.org/wiki/Mixin oder http://en.wikipedia.org/wiki/Composite_pattern konsultieren.

In der Tat geben Sie "bestimmte Funktionalität (durch A spezifiziert) an, die vererbt oder nur von einer Unterklasse wiederverwendet werden soll (d. H. Algorithm)". (cit. aus dem ersten Artikel)

Mit anderen Worten, Sie machen sich (oder Ihr Benutzer) frei, Verhalten hinzufügen oder ändern Algorithm irgendwie "nachher". Ihr wirklicher Vorteil besteht darin, eine solche Flexibilität zu erreichen, die nur auf dem Compiler beruht und nicht auf einem dynamischen Mechanismus wie dem Mechanismus (z. B. das Überschreiben virtueller Funktionen). Ihre letzte Klasse Algorithm<A>, in der Tat, bei der Kompilierung gebaut und es ist möglicherweise so effizient wie die Klasse, die Sie erhalten haben, würden Algorithm<A> ausdrücklich schriftlich (das heißt ausdrücklich einschließlich der Politik A in Algorithm es von Hand zu schreiben).

EDIT:

Ich würde auch einen Blick auf diese Wikipedia-Seite über richtlinienbasierte Design (http://en.wikipedia.org/wiki/Policy-based_design) zu geben, vor.

Dort erscheinen die Richtliniennamen (Ihre A) in einer übersichtlichen Form mit klaren Namen, wie von @ full.stack.ex empfohlen.

+1

Also, wenn das ist, was Sie wollen, in Ordnung. Was die Lesbarkeit anbetrifft, stimmt es, dass es eine Tradition hat, die Template-Parameter seltsam zu benennen - I, P, A, usw. Aber du musst nicht :). Gib ihnen bessere Namen und sie können selbst beschreibend werden. –

+1

Danke für deine Antwort, aber ich habe noch eine Frage. Ich verstehe die Verwendung einer allgemeinen und abstrakten Definition einiger Funktionalitäten in einer "höheren" Klasse. Das Hauptziel einer Vorlage besteht jedoch nicht darin, Parametertypen zu verallgemeinern. Was ich am Ende sage, ist, dass ich fast alles an diese höhere Klasse weitergeben kann und Funktionen mit niedrigerer Hierarchie einsparen kann. Am Ende werde ich eine sehr begrenzte Menge von Objekten haben, die (vielleicht eine) die unteren Funktionen erben können, liege ich falsch? Es ist keine unpraktische Möglichkeit, diese Generizität zu definieren? –