71 votes

Bénéficier du Polymorphisme

Quand j'ai commencé à rechercher les avantages de polymorphisme, je l'ai trouvé avec cette question ici. Mais ici, j'ai été incapable de trouver ma réponse. Permettez-moi de dire ce que je veux savoir. Ici, j'ai certaines classes:

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();
}

Maintenant, ici, j'ai créé deux objets dans la Démo de la classe et sont des références de l' Refrigerator. J'ai complètement compris qu'à partir de l' rf objet que je suis en mesure d'appeler l' trip() méthode de Refrigerator, mais cette méthode sera caché pour l' cm objet. Maintenant ma question est: pourquoi devrais-je utiliser le polymorphisme ou pourquoi devrais-je utiliser

CoolingMachines cm = new Refrigerator();

quand je suis OK avec

Refrigerator rf = new Refrigerator();

Est polymorphe de l'objet de l'efficacité est bonne ou de la lumière dans le poids? Quel est l'objectif de base et de la différence entre ces deux objets? Quelle est la différence entre cm.start(); et rf.start()?

72voto

pgras Points 7202

Il est utile lorsque vous gérez des listes de... Un petit exemple:

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

Ou quand vous le souhaitez afin de permettre une méthode de travail avec une sous-classe de CoolingMachines

58voto

Jon Skeet Points 692016

Dans le cas où vous êtes vraiment bon à savoir la classe de béton, il n'y a aucun avantage. Cependant, dans de nombreux cas, vous voulez être en mesure d'écrire du code qui ne sait plus sur la base de la classe ou de l'interface.

Regardez, par exemple, Iterables de Goyave - qui a beaucoup de méthodes qui (pour la plupart) ne se soucient pas de ce que la mise en œuvre de l' Iterable est utilisé. Vous voulez vraiment tout ce que le code séparément pour chaque mise en œuvre?

Où vous pouvez code d'une classe de base abstraite ou une interface, vous vous permettez de les utiliser plus tard, d'autres implémentations qui partagent la même API publique, mais peuvent avoir des implémentations différentes. Même si vous ne voulez qu'une seule production, mise en œuvre, vous pouvez bien voulez des implémentations alternatives pour les tests. (Dans la mesure où cela s'applique très bien, dépend de la classe en question.)

30voto

Naveen Points 37095

Parce que plus tard, si vous souhaitez utiliser AirConditioner au lieu de Refrigerator pour le refroidissement, et seulement ensuite le code que vous avez besoin de changer est - CoolingMachines cm = new AirConditioner();

17voto

Simeon Visser Points 30697

La raison pour laquelle vous souhaitez utiliser

CoolingMachines cm = new Refrigerator();

est que plus tard, vous pourrez facilement utiliser un autre CoolingMachines. Vous avez seulement besoin de changer une ligne de code et le reste du code (comme il en va uniquement utiliser des méthodes d' CoolingMachines, qui est plus général que d'une machine spécifique, tel qu'un Refrigerator).

Donc, pour une instance particulière d' Refrigerator, les appels cm.start(); et rf.start() fonctionnent de la même façon, mais cm peut également être différente CoolingMachines objet. Et que cet objet peut être différente de la mise en œuvre de l' start().

7voto

Première réponse:

Utiliser le polymorphisme pour la méthode overridding et la surcharge de méthode. D'autres méthodes de la classe utilisée dans une classe différente alors deux options: la première méthode héritée, la deuxième méthode par rapport à l'écrit. Ici, étendre l'interface: les utiliser, ou de la mise en œuvre de la méthode: la logique d'écriture. Polymorphisme utilisé pour la méthode, l'héritage de classe.

Deuxième réponse:

Quelle est la différence entre cm.start(); et rf.start();?

Oui, les deux sont des objets qui sont complètement différents les uns par rapport aux autres. Ne pas créer les objets de l'interface, car Java ne supporte pas les objets de l'interface. Premier objet créé pour l'interface et la deuxième pour Réfrigérateur de classe. Deuxième objet de la droite maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X