Was ist der richtige Weg, um meine Schnittstelle zu entwerfen, wenn ich Operationen habe, die nicht von allen Implementierern unterstützt werden?

7

Ich habe eine Schnittstelle und zwei Klassen, die die Schnittstelle implementieren.

%Vor%

Die Klasse MyClass1 sagt mir Add unimplemented methods , weil die secondMethod nicht implementiert ist, OK, ich werde das tun. Aber das Problem ist, dass ich diese Methode in MyClass1 nicht benötige.

Was ist Ihrer Meinung nach das Beste?

  1. Fügen Sie der nicht implementierten Methode etwas wie return 0 hinzu
  2. Es gibt eine andere Möglichkeit, dies zu beheben, wenn ich es nicht implementieren möchte.
Wassim AZIRAR 27.07.2011, 11:30
quelle

8 Antworten

14

Sie sollten einen der folgenden Schritte ausführen:

  1. Zerlegen Sie die Benutzeroberfläche in kleinere Teile und komponieren Sie sie nach Bedarf. Dies ist der bevorzugte Ansatz, besonders wenn Sie MyInterface kontrollieren.

  2. Geben Sie den sinnvollsten Standardwert zurück, den Sie verwenden können.

  3. Wirf ein UnsupportedOperationException .

Hier ist ein illustrativeres Beispiel. Nehmen wir an, Ihre Benutzeroberfläche sieht folgendermaßen aus:

%Vor%

Wenn Ihr MyClass1 tatsächlich ein Boat ist und keine Fahrzeugidentifikationsnummer hat, ist es für Sie nicht sinnvoll, dies zu implementieren. In der Tat ist es eigentlich falsch. Andere Kunden erwarten, dass Sie diesen Wert haben, aber Sie können es ihnen nicht geben.

Es wäre besser, die Schnittstellen in kleinere Teile zu zerlegen und zu komponieren, wobei Sie je nach Bedarf das richtige Stück verwenden. Zum Beispiel könnten Sie stattdessen Folgendes schreiben:

%Vor%

Dies ist der beste Ansatz, da die Verantwortlichkeiten genau nach Bedarf über die Schnittstellen verteilt werden.

Wenn es wirklich war in Ihrer Domain wichtig zu sein, dass alle Driveables eine Fahrzeugidentifikationsnummer haben, und dies ist nur ein Spezialfall, wo die Fahrzeugidentifikationsnummer unbekannt oder nicht verfügbar ist, dann können Sie angeben eine Standardimplementierung:

%Vor%

Wenn es in Ihrer Domain falsch wäre, eine Fahrzeugidentifikationsnummer zurückzugeben, sollten Sie eine Ausnahme auslösen:

%Vor%     
John Feminella 27.07.2011, 11:33
quelle
2

Wenn Sie es immer noch in der Schnittstelle benötigen und es nie aufgerufen werden sollte (in dieser Implementierung), würde ich implementieren, dass es ein Nicht unterstützteOperationException :

%Vor%     
dacwe 27.07.2011 11:32
quelle
2

Wenn es für Sie irrelevante Methoden gibt:

  1. Vielleicht sollten Sie diese Schnittstelle nicht verwenden, sondern das Design ändern.
  2. Stub-Methoden hinzufügen (wie Sie es getan haben).
MByD 27.07.2011 11:32
quelle
1

Das hängt von der Anforderung ab. 1. Interface pattern ist nützlich, wenn jede andere Klasse, die die Schnittstelle implementiert, fast das gleiche Verhalten hat, was erklärt, warum die Methodenimplementierung obligatorisch ist.

  1. Wenn Sie glauben, dass einige Klassen Methoden benötigen und andere nicht, können Sie wahrscheinlich das abstrakte Klassenmodell verwenden, in dem Sie die Implementierung erweitern und angeben können, die Ihre Klasse benötigt.

Grundsätzlich müssen Sie den Anruf annehmen, was Ihren Zweck in größerem Maße löst.

für Ex: Wenn 9 von 10 Methoden, die Sie implementieren, dann wahrscheinlich bessere Idee ist, nur mit Return 0 zu implementieren.

    
Swagatika 27.07.2011 11:46
quelle
0

Um dies zu erreichen, müssen Sie eine abstrakte Elternklasse statt einer Schnittstelle verwenden (was möglicherweise nicht das ist, was Sie wollen).

    
sparkymat 27.07.2011 11:32
quelle
0

Normalerweise erstellen Sie in diesen Fällen eine Basisklasse, die leere Implementierungen aller Schnittstellenmethoden bereitstellt und von ihr ausgeht. Schauen Sie sich zum Beispiel MouseAdapter

    
Bozho 27.07.2011 11:32
quelle
0

Nein, es gibt keinen Weg, weil Sie die Schnittstelle implementieren (mit allen Methoden darin). Es ist nicht zulässig, nur eine Methode zu implementieren. Dies wird den Polimorphismus aufheben

    
Zemzela 27.07.2011 11:33
quelle
0

Sie machen eine Klasse, die jedem Anrufer verspricht, dass er all die Dinge tun wird, die MyInterface bietet.

Etwas stimmt grundsätzlich nicht mit dem Design, wenn Sie diese Verpflichtung nicht einhalten können.

Versetzen Sie sich in die Position des Anrufers: Was werden sie mit der Antwort von secondMethod () tun? Höchstwahrscheinlich gibt es einen sinnvollen Wert wie 0 oder 1, den Sie zurückgeben können.

Wichtig ist, dass Sie Ihren Anrufer nicht überraschen, also lehne ich das Auslösen einer NotImplementedException ab.

    
djna 27.07.2011 11:36
quelle