Frage

Wenn Sie eine C ++ Vererbungsstruktur zu schaffen, müssen Sie Mitglied Funktionen genau gleich an mehreren Stellen definiert werden:

Wenn B ist eine abstrakte Basisklasse, und D, E und F alle vererben B, könnte man dieses:

class B
{
   virtual func A( ... params ) = 0;
};

class D : public B
{
   func A( ... params );
};

/* ... etc... similar implementations for E and F */

So gibt es offensichtlich einige Überschneidungen hier. Wenn die Schnittstelle zu B groß ist, kann man viele Orte zu ändern, wenn die Schnittstelle muss sich ändern müssen.

Ein Kollege schlug vor, einige Tricks mit einem eingebetteten craftily erstellt #includes, ala:

class D: public B
{
   #include "B_Interface.h"  // B_Interface.h is a specially crafted .h file
}

Dies scheint ein wenig kludgy? Ist es? Gibt es eine bessere Lösung Dual Wartung zu vermeiden?

Auch hier vielleicht die Lösung ist wirklich eine bessere Werkzeuge, um die Sprache zu unterstützen, wie Visual X Assist?

Edit:. Nehmen wir die abgeleiteten Klassen müssen eindeutig Implementierungen

War es hilfreich?

Lösung

Eigentlich ist das größte Problem mit einer Schnittstelle in der Regel zu ändern ist die gesamte Code, dass verwendet es, nicht der Code, implementiert es. Wenn es so einfach ist es für die Implementierer zu ändern, wäre es wahrscheinlich das Leben schwerer für die Nutzer machen.

Andere Tipps

Das ist es schmerzhaft eine weit verbreitete Schnittstelle zu ändern, ist kein Fehler; es ist eine Eigenschaft.

  

Auch hier vielleicht die Lösung ist wirklich eine bessere Werkzeuge, um die Sprache zu unterstützen, wie Visual X Assist?

Genau. Ändern Methodensignaturen ist ein Schlüsselmerkmal von Refactoring-Tools.

Wenn Sie sie immer und immer mit einem gewissen Standard-Verhalten zu implementieren, haben dann vielleicht sollten sie nur virtuell sein, und nicht rein virtuell.

Statt mit dem Prä-Prozessor für noch eine andere Möglichkeit, es sollte nicht verwendet werden würde ich mein Editor (oder IDE, wenn das, was Sie Lust haben.) Versuchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top