Vorteil des Polymorphismus
Als ich begann zu suchen, die Vorteile des Polymorphismus, fand ich mit diese Frage hier. Aber auch hier konnte ich meine Antwort finden. Lassen Sie mich sagen, was ich will zu finden. Hier habe ich ein paar Klassen:
class CoolingMachines{
public void startMachine(){
//No implementationion
}
public void stopMachine(){
//No implementationion
}
}
class Refrigerator extends CoolingMachines{
public void startMachine(){
System.out.println("Refrigerator Starts");
}
public void stopMachine(){
System.out.println("Refrigerator Stop");
}
public void trip(){
System.out.println("Refrigerator Trip");
}
}
class AirConditioner extends CoolingMachines{
public void startMachine(){
System.out.println("AC Starts");
}
public void stopMachine(){
System.out.println("AC Stop");
}
}
public class PolymorphismDemo {
CoolingMachines cm = new Refrigerator();
Refrigerator rf = new Refrigerator();
}
Nun hier habe ich zwei Objekte in der Demo-Klasse und Referenzen sind von Refrigerator
. Ich habe durchaus verstanden, dass aus der rf
Objekt bin ich in der Lage, um die trip()
Methode der Refrigerator
aber diese Methode wird versteckt für die cm
Objekt. Nun meine Frage ist, warum sollte ich verwenden Polymorphismus oder warum sollte ich
CoolingMachines cm = new Refrigerator();
wenn ich bin OK mit
Refrigerator rf = new Refrigerator();
Ist polymorphes Objekt ist die Effizienz gut ist oder Licht im Gewicht? Was ist der grundlegende Zweck und die Differenz zwischen diesen beiden Objekten? Gibt es einen Unterschied zwischen cm.start();
und rf.start()
?
InformationsquelleAutor der Frage khan | 2012-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nützlich, die Sie beim Umgang mit Listen...
Ein kurzes Beispiel:
Oder wenn Sie zulassen möchten, dass eine Methode funktioniert mit einer beliebigen Unterklasse von
CoolingMachines
InformationsquelleAutor der Antwort pgras
In Fällen, In denen Sie wirklich okay mit dem wissen der konkreten Klasse, es gibt keinen Vorteil. Doch in vielen Fällen, die Sie wollen in der Lage sein, code zu schreiben, die kennt nur die Basisklasse oder Schnittstelle.
Betrachten Sie zum Beispiel
Iterables
in Guave - das ist eine Menge von Methoden, die (meist) egal, was die Umsetzung vonIterable
verwendet wird. Würdest du wirklich wollen, dass alle, die Codes, die separat für jede Umsetzung?Wo Sie kann code für eine abstrakte Basisklasse oder ein interface, Sie lassen sich später verwenden andere Implementierungen, die denselben öffentlichen API, aber möglicherweise unterschiedliche Implementierungen. Auch wenn Sie nur eine einzelne Produktion Umsetzung, möchten Sie möglicherweise alternative Implementierungen für Tests. (Inwieweit dies gilt, hängt stark von der Klasse in Frage.)
InformationsquelleAutor der Antwort Jon Skeet
Weil, wenn Sie später verwenden möchten
AirConditioner
stattRefrigerator
für die Kühlung, dann nur code, den Sie ändern müssen, istCoolingMachines cm = new AirConditioner();
InformationsquelleAutor der Antwort Naveen
Den Grund, den Sie verwenden möchten
ist, können Sie Sie später leicht mit einem anderen
CoolingMachines
. Sie brauchen nur zu ändern, dass eine Zeile code, und den rest, der code wird immer noch funktionieren (es wird nur mit den Methoden derCoolingMachines
die allgemeiner als eine bestimmte Maschine, wie einRefrigerator
).Also für eine bestimmte Instanz von
Refrigerator
die Anrufecm.start();
undrf.start()
auf die gleiche Weise arbeiten, abercm
könnte auch eine andereCoolingMachines
Objekt. Und dieses Objekt könnte eine unterschiedliche Umsetzung derstart()
.InformationsquelleAutor der Antwort Simeon Visser
Erste Antwort:
Verwenden Polymorphismus für die Methode overridding und die Methode überladen. Andere Klasse die Methoden in der anderen Klasse dann zwei Optionen: Erstens geerbten Methode, die zweite Methode, die über geschrieben. Hier verlängern-Schnittstelle: verwenden Sie, oder die Implementierung Methode: Logik schreiben. Polymorphismus verwendet für eine Methode, eine Klasse die Vererbung.
Zweite Antwort:
Gibt es einen Unterschied zwischen
cm.start();
undrf.start();
?Ja, beide sind Objekte, die ganz anders sind, mit Respekt zu einander. Erstellen Sie keine interface-Objekte, weil Java nicht unterstützt interface-Objekte. Erstes Objekt geschaffen für die Schnittstelle und die zweite für Kühlschrank Klasse. Das zweite Objekt jetzt.
InformationsquelleAutor der Antwort Solomon Bindavid
Die Allgemeine Antwort auf den Allgemeinen Teil der Frage (warum sollte ich das nutzen Polymorphismus?) wird Polymorphismus realisiert, ein paar kritische Objekt-orientierte design-Prinzipien, zum Beispiel:
Wiederverwendung von code:
Indem Sie code, der alle gemeinsam zu Ihrer "cooling-Maschinen' in die Kühlung-Maschine, Sie müssen nur schreiben, dass der code einmal und für alle änderungen an diesem code trickle-down sofort.
Abstraktion:
Das menschliche Gehirn kann nur verfolgen, so viel Zeug, aber Sie sind gut in Kategorien und Hierarchien. Dies hilft zu verstehen, was geschieht in einem großen Programm.
Kapselung:
jede Klasse verbirgt die details von dem, was es tut, und baut einfach auf die Schnittstelle der Basisklasse.
Trennung von Belangen:
eine Menge von Objekt-orientierten Programmierung ist über die Zuordnung von Verantwortlichkeiten. Wer wird verantwortlich sein? Spezielle Anliegen können Sie gehen in den Unterklassen.
So Polymorphismus ist nur ein Teil der größeren Bild oo, und die Gründe für die Nutzung manchmal nur dann Sinn machen, wenn Sie gehen, um zu versuchen und tun 'echte' oo-Programmierung.
InformationsquelleAutor der Antwort Scruffy
Einen einfachen Anwendungsfall des Polymorphismus ist, dass Sie haben eine Reihe von coolingMachines, wo element 0 ist ein Kühlschrank und element 1 ist ein AirConditioner etc...
Brauchen Sie nicht zu preform jede überprüfung oder stellen Sie sicher, auf welches Objekt Sie zu tun, um Reise oder starten etc.
Kann dies ein großer Vorteil, wenn Sie die Einnahme von Benutzereingaben und mit der Iteration über alle Objekte und rufen Sie ähnliche Funktionen
InformationsquelleAutor der Antwort Simon McLoughlin
Gebe ich ein einfach zu verstehendes Beispiel. Können sagen, Sie haben einige json
Nun angenommen, programmgesteuert Sie möchten, nennen Sie den Namen, Typ und Wert. Anstatt einen Schalter() für jeden Typ (array, string für die sz, etc) können Sie nur eine Basis-Typ und eine Funktion aufrufen, die macht seinen job. Es ist auch mehr cpu effizienter ist als die Verwendung eines switch mit einem Dutzend Arten.
Dann gibt es plugins, libs und fremden code mit interface-Gründen.
InformationsquelleAutor der Antwort
Verwenden Sie Ihre Objekte polymorph hilft auch zu schaffen, Fabriken oder Familien von zusammenhängenden Klassen, die einen wichtigen Teil ein, wie Factory Design Pattern umgesetzt wird. Hier ist ein sehr einfaches Beispiel für die polymorphe Fabrik:
Nutzung von calling oben code:
Auch vorstellen, dass Sie haben eine Methode wie folgt verwendet Beton der Klasse parameter
Refrigerator
:Nun, wenn Sie ändern Sie über die Umsetzung der
UseObject()
Methode zu verwenden, die generische Basisklasse parameter, der aufrufende code bekommen würde Vorteil zu passieren, alle parameter polymorph und können dann genutzt werden, innerhalb der MethodeUseObject()
:Obige code ist jetzt besser erweiterbar als andere Unterklassen Hinzugefügt werden könnten später an die Familie von
CoolingMachines, und Objekte, die von diesen neuen Unterklassen würde auch funktionieren mit dem vorhandenen code.
InformationsquelleAutor der Antwort VS1