it-swarm.com.de

Nutzen des Polymorphismus

Wenn ich für die Vorteile von Polymorphismus zu suchen begann, fand ich mit diesem Frage hier. Aber hier war ich nicht in der Lage, meine Antwort zu finden. Lassen Sie mich sagen, was ich finden möchte. Hier habe ich einige 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();
}

Jetzt habe ich hier zwei Objekte in der Demo-Klasse erstellt und verweise auf Refrigerator. Ich habe vollständig verstanden, dass ich vom Objekt rf aus die Methode trip() von Refrigerator aufrufen kann, aber diese Methode wird für das Objekt cm ausgeblendet . Nun meine Frage ist, warum sollte ich Polymorphismus oder warum sollte ich

CoolingMachines cm = new Refrigerator();

wenn es mir gut geht

Refrigerator rf = new Refrigerator();

Ist polymorphes Objekt Effizienz ist gut oder leicht im Gewicht? Was ist der Grundzweck und der Unterschied zwischen diesen beiden Objekten? Gibt es einen Unterschied zwischen cm.start(); und rf.start()?

69
khan

Es ist nützlich, wenn Sie Listen handhaben ... Ein kurzes Beispiel:

List<CoolingMachines> coolingMachines = ... // a list of CoolingMachines 
for (CoolingMachine current : coolingMachines) {
    current.start();
}

Oder wenn Sie zulassen möchten, dass eine Methode mit einer Unterklasse von CoolingMachines arbeitet.

71
pgras

In Fällen, in denen es Ihnen wirklich recht ist, die konkrete Klasse zu kennen, gibt es keinen Vorteil. In vielen Fällen möchten Sie jedoch in der Lage sein, Code zu schreiben, der nur die Basisklasse oder die Schnittstelle kennt.

Schauen Sie sich zum Beispiel Iterables in Guava an - das sind viele Methoden, die sich (meistens) nicht darum kümmern, welche Implementierung von Iterable wird benutzt. Möchten Sie wirklich, dass der gesamte Code für jede Implementierung separat bereitgestellt wird?

Wo Sie kann Code auf eine abstrakte Basisklasse oder eine Schnittstelle, können Sie sich später auf andere Implementierungen verwenden, die die gleiche öffentliche API teilen, kann aber anders haben Implementierungen. Auch wenn Sie nur eine einzige Produktionsimplementierung wünschen, möchten Sie möglicherweise alternative Implementierungen zum Testen. (Inwieweit dies sehr wichtig ist, hängt von der jeweiligen Klasse ab.)

58
Jon Skeet

Denn wenn Sie später AirConditioner anstelle von Refrigerator zum Kühlen verwenden möchten, müssen Sie nur den Code CoolingMachines cm = new AirConditioner(); ändern.

28
Naveen

Der Grund, dass Sie verwenden möchten

CoolingMachines cm = new Refrigerator();

ist, dass Sie später leicht eine andere CoolingMachines verwenden können. Sie müssen nur diese eine Codezeile ändern, und der Rest des Codes funktioniert weiterhin (da nur Methoden von CoolingMachines verwendet werden, die allgemeiner sind als ein bestimmter Computer, wie z. B. ein Refrigerator).

Für eine bestimmte Instanz von Refrigerator funktionieren die Aufrufe cm.start(); und rf.start() auf dieselbe Weise, aber cm kann auch eine andere CoolingMachines Objekt. Und dieses Objekt könnte eine andere Implementierung von start() haben.

17
Simeon Visser

Erste antwort:

Verwendung Polymorphismus für Verfahren overridding und Verfahren Überlastung. Andere Klassenmethoden, die in einer anderen Klasse verwendet werden, haben dann zwei Optionen: erste Methode geerbt, zweite Methode überschrieben. Hier Schnittstelle erweitern: Verwenden Sie sie, oder Implementierungsmethode: Logik schreiben Sie sie. Polymorphismus für Methode, Klassenvererbung.

Zweite Antwort:

Gibt es einen Unterschied zwischen cm.start(); und rf.start();?

Ja, beide sind völlig unterschiedliche Objekte. Erstellen Sie keine Interface-Objekte, da Java unterstützt keine Interface-Objekte. Erstes Objekt für Interface und zweites für Refrigerator-Klasse erstellt. Zweites Objekt im Moment.

7

Die allgemeinste Antwort auf den allgemeinen Teil Ihrer Frage (warum sollte ich Polymorphismus verwenden?) Lautet, dass Polymorphismus einige wichtige objektorientierte Entwurfsprinzipien verwirklicht, zum Beispiel:

  • wiederverwendung von Code: beliebigen Code Indem die für alle Ihre ‚Kühlmaschinen‘ in Kühlmaschine üblich ist, brauchen Sie nur nach unten sofort, dass Code einmal und alle Änderungen an diesen Code Rinnsal zu schreiben.

  • abstraktion: Das menschliche Gehirn kann nur verfolgen, so viel Zeug, aber sie sind gut in Kategorien und Hierarchien. Dies hilft zu verstehen, was in einem großen Programm passiert.

  • verkapselung: jede Klasse verbirgt die Details, was es tut und baut gerade an der Schnittstelle der Basisklasse.

  • trennung von Bedenken: Bei vielen objektorientierten Programmen geht es darum, Verantwortlichkeiten zuzuweisen. Wer wird dafür verantwortlich sein? Spezialisierte Anliegen können in Unterklassen eingeteilt werden.

So Polymorphismus ist nur ein Teil des größeren oo Bildes, und die Gründe für die Verwendung es sinnvoll, manchmal nur, wenn Sie versuchen werden und tun ‚real‘ oo Programmierung.

5
Scruffy

Ein einfacher Anwendungsfall von Polymorphismus ist, dass Sie eine Reihe von Kühlmaschinen haben können, wobei Element 0 ein Kühlschrank und Element 1 ein Klimagerät usw. ist.

Sie müssen keine Überprüfungen durchführen oder sicherstellen, mit welchem ​​Objekt Sie es zu tun haben, um die Reise anzurufen oder zu beginnen usw.

Dies kann ein großer Vorteil sein, wenn eine Eingabe von einem Benutzer zu nehmen und alle Objekte iterieren und mit ähnlichen Funktionen aufrufen

3

Die polymorphe Verwendung Ihrer Objekte hilft auch beim Erstellen von Fabriken oder Familien verwandter Klassen. Dies ist ein wichtiger Bestandteil der Implementierung von Factory Design Pattern . Hier ist ein sehr einfaches Beispiel für eine polymorphe Fabrik:

public CoolingMachine CreateCoolingMachines(string machineType)
{
    if(machineType == "ref")
        return new Refrigerator();
    //other else ifs to return other types of CoolingMachine family
}

verwendung des Aufrufs über Code:

CoolingMachine cm = CreateCoolingMachine("AC"); //the cm variable will have a reference to Airconditioner class which is returned by CreateCoolingMachines() method polymorphically

Stellen Sie sich außerdem vor, Sie haben eine der folgenden Methoden, die den konkreten Klassenparameter Refrigerator verwendet:

public void UseObject(Refrigerator refObject)
{
    //Implementation to use Refrigerator object only
}

Wenn Sie die obige Implementierung der Methode UseObject() ändern, um die meisten generischen Basisklassenparameter zu verwenden, kann der aufrufende Code alle Parameter polymorph übergeben, die dann in der Methode UseObject() verwendet werden können. :

public void UseObject(CoolingMachine coolingMachineObject)
{
    //Implementation to use Generic object and all derived objects
}

Der obige Code ist jetzt erweiterbarer, da andere Unterklassen später der Familie von CoolingMachines hinzugefügt werden könnten und Objekte dieser neuen Unterklassen auch mit dem vorhandenen Code funktionieren würden.

2
VS1

Ich werde ein leicht verständliches Beispiel geben. Nehmen wir an, Sie haben etwas Json

{"a":[1,2],"sz":"text", "v":3, "f":1.2}

Schauen wir uns nun sagen programmatisch Sie den Namen, den Typ und den Wert auflisten möchten. Statt einen Schalter von () für jeden Typ (Array für eine, String für sz, etc) Sie können nur einen Basistyp haben und eine Funktion aufrufen, die seine Arbeit erledigt. Es ist auch effizienter als die Verwendung eines Switches mit einem Dutzend Typen.

Dann gibt es Plugins, Bibliotheken und Fremdcode mit Schnittstellengründen.

2
user34537