2 Stimmen

Zwei sehr ähnliche Klassen in C++ mit nur einer unterschiedlichen Methode: Wie soll man sie implementieren?

Ich habe zwei Klassen, die bis auf eine Methode fast identisch sind. Die Klassen haben den gleichen Datenteil und alle Mitgliedsfunktionen außer einer:

class A {
private:
  double data;
public:
  double calc(){
     return data*data;
  }
   double especific(){
     return 2.0*data;
  }
 }

und die zweite Klasse ist, abgesehen von der spezifischen Methode, identisch.

Insbesondere diese Mitgliedsfunktion benötigt alle Mitgliedsdaten zur Berechnung, so dass die Übergabe als Wert oder Referenz keine Option ist. Gibt es eine Möglichkeit, dies ohne eine Menge Code-Duplizierung zu implementieren? Entweder mit nur einer Klasse oder mit Vorlagen, aber nicht Vererbung (große Auswirkungen auf die Leistung).

Danke

EDITAR : Vielen Dank für die vielen Antworten. Die Strategie Muster kann in meinem Fall helfen, ich werde es versuchen und sehen, ob es funktioniert. Ich vermeide die virtuelle Vererbung wie die Pest, basierend auf einigen Tests, die ich in einem anderen Programm durchgeführt habe. Diese Routine wird überall aufgerufen werden, und die Leistung ist ein sehr wichtiger Faktor.

1voto

Lima Beans Punkte 282

Sehen Sie sich die Strategie-Muster

Sie könnten Ihre Klasse einen Funktor nehmen lassen, der dann spezifisch aufruft. Sie können verschiedene Funktoren für verschiedene Arten der Berechnung der Ausgabe bereitstellen. Es gibt mehrere andere Möglichkeiten, wie Sie Strategy implementieren können.

0voto

hydrogen Punkte 2828

Ich habe das Gefühl, dass ein Brückenmuster könnte ein guter Ansatz für Sie sein, da es sich so anhört, als ob Sie eindeutige Implementierungen für Ihre gemeinsame Abstraktion haben möchten.

0voto

Oliver Charlesworth Punkte 259497

Dazu gibt es mehrere Möglichkeiten, von denen Sie viele genannt haben:

  • Vererbung von einer gemeinsamen Basisklasse (die den größten Teil der Arbeit erledigt) und virtuelle especific()
  • Eine Klasse, mit zwei leicht unterschiedlich benannten especific() Methoden (oder überladene Methoden)
  • Spezialisierung auf Vorlagen verwenden
  • Haben A y B eine andere Klasse verwenden C um den Großteil der Arbeit zu erledigen.

Vielleicht gibt es noch andere.

Sie müssen sich für eine davon entscheiden, je nach der Semantik Ihrer Klassen und Ihrer Anwendung und je nach anderen spezifischen Einschränkungen oder Anforderungen.

0voto

user217299 Punkte 110

Prüfen Sie das "Vererbungsmuster".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X