So erweitern Sie eine Schnittstelle

8

Ich kodiere für die Schnittstelle.

Ich habe eine Schnittstelle A und eine Klasse B , die es implementiert.

Mir wurde gesagt, dass ich die Funktionen von B außer Kraft setzen könnte, indem ich sie um C erweitere, aber ich werde weder B noch angesprochen C und ersetzen Sie dann B durch C als Implementierungsklasse von A in den Konfigurationsdateien.

Ich finde, dass ich eine Methode brauche, die in A nicht verfügbar ist. Daher muss ich A eine Methode hinzufügen, die ich in C . Aber ich darf A nicht berühren.

Könnte mir jemand helfen, wie es gemacht werden könnte?

Danke.

BEARBEITEN : Beispielcode:

A.java

%Vor%

B.java

%Vor%

Da ich nun weder A noch B anfassen durfte, musste ich eine andere Klasse C schreiben und sie von B erweitern, um meine Sachen zu machen.

C.java

%Vor%

Jetzt brauche ich eine andere Methode void Z() in C.java , um mein Ding zu machen, aber weil ich die Schnittstelle A codiere, wenn ich eine Methode nur auf C.java Bei Verwendung von A's Referenzvariable kann ich Z() nicht aufrufen, daher muss ich auch void Z() in A interface deklarieren, um es so zu benutzen, aber wenn ich das tue, muss ich es tun berühre A , was mir nicht erlaubt ist. Wie dieses Problem gelöst werden kann, habe ich versucht zu stellen.

Ich kann also im Wesentlichen Folgendes nicht tun:

%Vor%

Gibt es irgendeine Möglichkeit für mich, so etwas zu erreichen, ohne A oder B zu berühren?

    
skip 08.09.2012, 06:05
quelle

6 Antworten

7

Ich glaube, ich verstehe was du willst. Sie haben Folgendes:

%Vor%

Wenn es das ist, was Sie wollen, dann fürchte ich, dass es nicht getan werden kann. Wer mit A arbeitet, kennt nur die in A ; Sie werden nicht wissen, dass Sie someNewMethod() in Ihrer Klasse C definiert haben. Sie müssen A ändern können.

Beachten Sie, dass Sie in Extremfällen den Klassentyp der Instanzen von A überprüfen können:

%Vor%

aber das ist wirklich hässlich und bricht viele der Hauptregeln der OO-Programmierung.

    
Duncan Jones 08.09.2012, 08:47
quelle
1

Ich weiß nicht, ob das erlaubt ist, aber Sie können sowohl Schnittstellen als auch Klassen erweitern, Sie könnten folgendes tun:

öffentliche Schnittstelle A2 erweitert A {     public void mySuperVeryInterestingNewMethod (); }

    
11684 08.09.2012 19:00
quelle
0

Also, nach dem, was du gerade geschrieben hast, kannst du A, B oder C nicht berühren ... also erweitere C mit D?

Dann können Sie beliebige Methoden hinzufügen, die Sie benötigen / wollen.

    
Jayson 08.09.2012 06:07
quelle
0

Ihre Frage ist überhaupt nicht klar. Ist das, was du meinst oder was du willst?

%Vor%     
Yohan Weerasinghe 08.09.2012 06:49
quelle
0

Wenn die Methode unterstützend ist, müssen Sie sie nicht zu einer Schnittstelle hinzufügen, um sie zu implementieren. Wenn es an anderer Stelle verwendet wird, implementiert B eine andere Schnittstelle D.

    
Stuart Wakefield 08.09.2012 07:47
quelle
0

Dies könnte Ihr Problem lösen:

%Vor%

Gemäß Ihrer Anforderung

1 - Sie haben eine Schnittstelle A erstellt.

2 - Eine Klasse B erstellt, die A implementiert.

3-erstellt eine Klasse C, die B erweitert und A implementiert.

4- A a = new C () erstellt eine Referenzvariable vom Typ A, aber zur Laufzeit wird das Objekt von C gehalten.

Da Sie B und C nicht berühren können, sind die Signaturen gleich und Sie rufen X () und Y () von B auf, wobei Sie das Objekt von C verwenden, während es B erweitert.

Sie haben also B durch C ersetzt, ohne X und Y in C zu implementieren und Änderungen an B vorzunehmen.

Ausgabe:

%Vor%

Hoffe, dass dies deine Frage beantwortet.

    
Ashraf Mulla 30.09.2016 11:35
quelle