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?
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. –
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? –
Sie haben Recht.Sicherlich passt nur ein bestimmter Satz von Klassen "A" in "Algorithmus ", was schließlich die Kompilierung erlaubt (diese "A" muss irgendwie implementieren eine Schnittstelle, die durch 'Algorithmus <>' spezifiziert ist). Jetzt verwenden Sie Vorlage für Design-Zwecke. Was Sie tun wollen, ist 'Algorithmus <>' einmal zu schreiben, und mehrere Algorithmen (zB 'Algorithmus', 'Algorithmus ', ...) zu haben, die nur kleine Codeabschnitte mehr schreiben (zB Klassen 'RungeKutta',' Symplektisch ...). Irgendwie sind Sie immer noch allgemein in Bezug auf den Typ. –
Acorbe