Überladen von Methoden, um spezielle Fälle einer Schnittstelle zu implementieren

9

Disclaimer: Ich war nicht in der Lage, genau zu beschreiben, was ich zu tun versuche, also hoffe ich, dass das Beispiel klarer als meine Erklärung ist! Bitte schlagen Sie eine Umformulierung vor, um sie klarer zu machen. :)

Ist es möglich, Funktionen mit spezifischeren Versionen als den von einer Schnittstelle benötigten Versionen zu überschreiben, um die Unterklassen der Parameter von Methoden in dieser Schnittstelle getrennt vom generischen Fall zu behandeln? (Beispiel und bessere Erklärung unten ...) Wenn es nicht direkt gemacht werden kann, gibt es ein Muster, das verwendet werden kann, um einen ähnlichen Effekt zu erzielen?

Beispiel

%Vor%

Meine Motivation

Ich möchte in der Lage sein, mehrere verschiedene konkrete NodeProcessor s zu implementieren, von denen einige alle Knoten gleich behandeln (dh nur das implementieren, was in der Schnittstelle angezeigt wird) und einige davon zwischen verschiedenen Arten von Knoten unterscheiden (z in Code%). Daher möchte ich den zweiten Aufruf von MyNodeProcessor verwenden, um die Implementierung in processNode(dn) zu verwenden, indem ich die Interface-Methoden überladen habe (einige Teile / Unterklassen von). Ist das möglich?

Offensichtlich, wenn ich MyNodeProcessor::processNode(DerivedNode) auf den Typ processor ändere, funktioniert das wie erwartet, aber ich muss in der Lage sein, verschiedene Knoten-Prozessoren austauschbar zu verwenden.

Ich kann das auch umgehen, indem ich eine einzige Methode MyNodeProcessor* habe, die den genauen Typ ihres Arguments zur Laufzeit und darauf basierende Verzweigungen prüft. Es erscheint mir unelegant, diese Überprüfung in meinen Code aufzunehmen (besonders, da die Anzahl der Knotentypen wächst und ich eine riesige Switch-Anweisung habe). Ich denke, die Sprache sollte helfen können.

Ich benutze C ++, aber ich bin auch an allgemeinen Antworten interessiert, wenn Sie bevorzugen (oder wenn das in anderen Sprachen einfacher / anders ist).

    
Ben 28.05.2013, 13:02
quelle

3 Antworten

2

Nein, das ist auf diese Weise nicht möglich. Der Versand der virtuellen Methode erfolgt bei Compiletime, d. H. Verwendet den statischen Typ des Prozessorzeigers, nämlich NodeProcessingInterface . Wenn dieser Basistyp nur eine virtuelle Funktion hat, wird nur diese eine virtuelle Funktion (oder ihre übergeordneten Implementierungen) aufgerufen. Der Compiler hat keine Möglichkeit zu bestimmen, dass es sich um eine abgeleitete NodeProcessor-Klasse handelt, die höherwertige Funktionen implementiert.

Anstatt also die Methoden in abgeleiteten Klassen zu diversifizieren, müssen Sie umgekehrt vorgehen: Deklarieren Sie alle anderen virtuellen Funktionen, die Sie in der Basisklasse benötigen, überschreiben Sie sie nach Bedarf:

%Vor%     
Arne Mertz 28.05.2013, 13:25
quelle
1

Sie haben Recht damit, dass Sie die Typprüfung nicht durchführen möchten. Das würde gegen das Open-Closed-Prinzip verstoßen - denn jedes Mal, wenn Sie einen speziellen Knotentyp hinzufügen, müssen Sie dies tun Modifizieren Sie diese Methode.

Was Sie beschreiben, klingt ähnlich wie eine Plugin-Architektur oder das Brückenmuster .

Wenn Sie Vererbung anstatt Überladung verwenden - also die spezialisierte processNode in eine Unterklasse von MyNodeProcessor verschieben - denke ich, wird Ihnen das geben, was Sie wollen.

BEARBEITEN:
Oder, in etwas anderen Zeilen, könnten Sie den Knotenprozessor zu einer Template-Klasse machen und Teilspezialisierung verwenden, um das gewünschte Verhalten zu erhalten.

    
David 28.05.2013 13:18
quelle
0

Nun, sobald ich von c ++ driftet ist in Ordnung, denke ich, was Sie wollen, heißt in Objective C "Kategorien". Sie könnten diesen Link interessant finden: Ссылка

    
akalenuk 28.05.2013 13:47
quelle

Tags und Links