Gewusst wie: erweitern einer Schnittstelle
Ich bin Codierung Schnittstelle.
Habe ich eine Schnittstelle Eine und eine Klasse B implementiert.
Mir wurde gesagt, dass könnte ich überschreiben B Funktionalitäten durch Verlängerung C aber ich bin gefragt, zu berühren, weder B noch C, und dann später ersetzen B mit C die Umsetzung Klasse von Eine in den Konfigurationsdateien.
Ich vermute, dass ich eine Methode erforderlich, die es nicht in Eine, also brauche ich eine Methode zum hinzufügen Eine, dass ich umsetzen konnte in C. Aber ich bin nicht erlaubt zu berühren Eine.
Könnte mir jemand helfen, wie-könnte-es-getan werden?
Dank.
BEARBEITEN:
Beispiel-code:
A.java
public interface A {
void X();
void Y();
}
B.java
public class B implements A {
public void X() {//something interesting}
public void Y() {//something not very interesting}
}
Nun, weil ich nicht durfte touch entweder A
oder B
ich hatte zu schreiben, eine andere Klasse C
und erweitern von B zu tun meine Sachen.
C.java
public class C extends B {
public void Y() {//overriding B's not very interesting Y and making it interesting}
}
Jetzt brauche ich eine andere Methode void Z()
im C.java zu tun mein Ding aber da bin ich die Codierung Schnittstelle A
wenn ich eine Methode nur auf C.java während der Verwendung A's
Referenz-variable, die ich nicht in der Lage zu nennen Z()
so werde ich zu erklären void Z()
im A
- Schnittstelle als auch, es zu benutzen, aber wenn ich das Tue, werde ich zu berühren A
was darf ich nicht. So, wie man dieses Problem behoben ist, was ich versucht habe zu Fragen.
Also im wesentlichen, ich werde nicht in der Lage, etwas zu tun, wie die folgenden:
A a = new C();
a.Z(); //can't do this
So ist es eine Möglichkeit für mich, etwas zu erreichen, ohne berühren von A oder B?
- haben Sie vielleicht bedeuten: Note weder A noch B
- plus: warum kann man nicht eine Methode, die nicht in der Schnittstelle? Dies ist nicht Objective-C!
- ja, ich weiß, dass ist möglich in ObjC zu, aber es ist häufiger vorhanden.
- Sie können nicht berühren Sie A, B, oder C und muss ersetzt werden B-mit C-Implementierung Einer? Dies ist unmöglich, es sei denn, Sie können entweder ändern C oder erweitern C zu D und ersetzen B mit Ihrem neuen Umsetzung D. Sie können nicht fügen Sie eine neue Methode außerhalb der Schnittstelle Ein und erwarten, dass es durch die Standard-Konsumenten von Einer s-Schnittstelle.
- OK, aber was meinst du eigentlich?
- "Ich Schätze, dass ich noch eine Methode, die nicht verfügbar in Einem, so muss ich fügen Sie eine Methode Ein, die ich umsetzen konnte in C." - was hast du hier gemeint? Sie haben zuerst gesagt, Sie müssen eine Methode, die nicht in A. Dann Sie sagen, Sie brauchen, um hinzuzufügen, dass die Methode Ein!!
- Sie schreiben die Klasse
C
Recht? dann was ist das problem? - vielleicht brauchen Sie entweder B oder C als abstrakte Klassen? dann müssen Sie nicht implementieren alle Methoden in abstrakten Klassen. Ist es das, was Sie wollen?
- Ja, gute Frage. Wenn C alle Methoden von A, kann er verwendet werden
- Tut mir Leid für die verspätete Antwort. Ich habe bearbeitet die Frage, für die es mehr klar. Ich bin mit Java.
- Ja, ich konnte es nicht berühren entweder
A
oderB
, so musste ich eine Klasse schreibenC
und erweitern vonB
zu überschreiben von Methoden implementiert, die inB
aber dann dachte ich, ich brauchte eine neue Methode, und da bin ich die Codierung Schnittstelle brauche ich, um diese Methode inA
so gut wie ich bin mitA's
Referenz-variable zu nennen, die Methoden und dieA's
Referenz-variable wird nicht unbedingt eine neu hinzugefügte Methode nur zuC
. - Ah, denke, Sie sind auf einige Gründe, über mich! @skip
- Wenn Sie Bearbeiten die Frage, bitte ändern Sie den ganzen text und lassen eine Frage, die Sinn macht, auf seine eigene. Hinzufügen von Bearbeitungen, die Sie auf das Ende nicht sehr hilfreich für die Leser.
- Ich habe eine endgültige Bearbeitung mit einem Beispiel, in einem Versuch zu erklären, das Problem versuche zu lösen, im Falle seiner möglich das zu machen, Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, ich verstehe, was Sie wollen. Sie haben die folgenden:
Wenn dies ist, was Sie wollen, dann fürchte ich, es kann nicht getan werden. Wer mit
A
kennt nur die Methoden definiert, die inA
; Sie werden nicht wissen, die Sie definiert habensomeNewMethod()
in Ihrer KlasseC
. Sie müssen geändert werden darfA
.Beachten Sie, dass in extremis, die Sie kontrollieren konnte, ob die Klasse den Typ der Instanzen
A
:aber das ist wirklich hässlich und bricht viele der kardinalen Regeln der OO-Programmierung.
Ich weiß nicht, ob Sie erlaubt sind, um dies zu tun, aber Sie können Sie erweitern interfaces sowie Klassen, die man tun könnte:
public interface A2 extends A {
public void mySuperVeryInterestingNewMethod();
}
A
dass Sie nicht vorstellen, zu ersetzen Sie alle Instanzen vonA
durchA2
. Es gab keine andere option, ich musste also deklarieren Sie die Methode im interfaceA
selbst. Danke für die Antwort:).So, nach dem, was Sie gerade schrieb, kann man nicht berühren, A, B, noch C... also, verlängern C mit D?
Dann können Sie hinzufügen, was auch immer Methoden, die Sie brauchen/wollen.
A
oderB
. Ich erstellteC
denn ich hatte zu überschreiben von Methoden implementiert, die inB
. Die Sache ist, dass ich die Codierung Schnittstelle so bin über eine Referenz-variable vom TypA
aber die Umsetzung KlasseA
könnteB
oderC
oderD but I've got to have that new method that I want to use declared in
A` fürA's
Referenz-variable zu verwenden, die zum aufrufen dieser Methode.Ihre Frage überhaupt nicht klar. Ist es das was du meinst oder was du willst?
A
oderB
. Ich erstellteC
denn ich hatte zu überschreiben von Methoden implementiert, die inB
. Die Sache ist, dass ich die Codierung Schnittstelle so bin über eine Referenz-variable vom TypA
aber die Umsetzung KlasseA
könnteB
oderC
oderD but I've got to have that new method that I want to use declared in
A` fürA's
Referenz-variable zu verwenden, die zum aufrufen dieser Methode.Wenn die Methode unterstützend ist, Sie brauchen nicht, um es hinzuzufügen, um eine Schnittstelle zu implementieren. Wenn es an anderer Stelle eingesetzt, dann B implementiert, die eine andere Schnittstelle D.
A
. Auf der client-front-ich bin mit Einer Referenz-variable zum aufrufen von Methoden.Könnte dies dein problem lösen:
Wie pro Ihre Anforderung
1-Sie haben ein interface-A.
2-Erstellt eine Klasse B, die für die Einführung A.
3-erstellt ein class C extends B und implementiert A.
4 - A A=new C() wird eine Referenz-variable vom Typ A, aber zur Laufzeit wird es halten das Objekt der C.
Da kann man nicht berühren Sie B und C die Signaturen sind die gleichen, und Sie sind dem Aufruf X() und Y() aus B mit Objekt C, wie es erstreckt sich B.
Somit haben Sie ersetzt, B mit C, ohne dass die Umsetzung von X und Y in C und die änderung B.
Ausgabe :
Hoffe, diese Antwort Ihre Frage.