En termes de Java, quand quelqu'un demande:
qu'est-ce que le polymorphisme?
Serait en surcharge ou outrepasser serait-il une réponse acceptable?
Je pense qu'il y a un peu plus que cela.
SI vous aviez une classe de base abstraite qui définissait une méthode sans implémentation et que vous définissiez cette méthode dans la sous-classe, est-ce toujours une surcharge?
Je pense que la surcharge n'est pas la bonne réponse à coup sûr.
java
oop
polymorphism
overloading
overriding
Brian G
la source
la source
Réponses:
La façon la plus claire d'exprimer le polymorphisme est via une classe de base abstraite (ou interface)
Cette classe est abstraite car la
goPee()
méthode n'est pas définissable pour les humains. Il n'est définissable que pour les sous-classes Homme et Femme. De plus, l'humain est un concept abstrait - vous ne pouvez pas créer un humain qui n'est ni masculin ni féminin. Ça doit être l'un ou l'autre.Nous reportons donc l'implémentation en utilisant la classe abstraite.
et
Maintenant, nous pouvons dire à une salle entière remplie d'humains d'aller faire pipi.
L'exécution de cela donnerait:
la source
goPee
ne prend pas un champ gravitationnel en entrée. Cette dépendance à l'égard de l'état global rend les tests unitairesCatheterizedIntersexAstronaut
difficiles et montre que le sous-classement n'est pas toujours la meilleure méthode de composition des caractères.Le polymorphisme est la capacité d'une instance de classe à se comporter comme si elle était une instance d'une autre classe dans son arbre d'héritage, le plus souvent l'une de ses classes ancêtres. Par exemple, en Java, toutes les classes héritent d'Object. Par conséquent, vous pouvez créer une variable de type Object et lui affecter une instance de n'importe quelle classe.
Une dérogationest un type de fonction qui se produit dans une classe qui hérite d'une autre classe. Une fonction de remplacement "remplace" une fonction héritée de la classe de base, mais le fait de telle manière qu'elle est appelée même lorsqu'une instance de sa classe prétend être un type différent par polymorphisme. En vous référant à l'exemple précédent, vous pouvez définir votre propre classe et remplacer la fonction toString (). Étant donné que cette fonction est héritée d'Object, elle sera toujours disponible si vous copiez une instance de cette classe dans une variable de type Object. Normalement, si vous appelez toString () sur votre classe alors qu'elle prétend être un Object, la version de toString qui se déclenchera réellement est celle définie sur Object lui-même. Cependant, comme la fonction est un remplacement, la définition de toString () de votre classe est utilisée même lorsque l'instance de classe '
La surcharge est l'action de définir plusieurs méthodes avec le même nom, mais avec des paramètres différents. Elle n'est pas liée à la neutralisation ni au polymorphisme.
la source
Ad hoc polymorphism
est ce que vous avez décrit dans votre section Surcharge et est un cas de polymorphisme.Le polymorphisme signifie plus d'une forme, le même objet effectuant des opérations différentes selon l'exigence.
Le polymorphisme peut être atteint en utilisant deux façons, ce sont
Surcharge de méthode signifie écrire deux ou plusieurs méthodes dans la même classe en utilisant le même nom de méthode, mais les paramètres de passage sont différents.
La substitution de méthode signifie que nous utilisons les noms de méthode dans les différentes classes, ce qui signifie que la méthode de classe parent est utilisée dans la classe enfant.
En Java pour obtenir le polymorphisme, une variable de référence de super classe peut contenir l'objet de sous-classe.
Pour atteindre le polymorphisme, chaque développeur doit utiliser les mêmes noms de méthode dans le projet.
la source
Voici un exemple de polymorphisme en pseudo-C # / Java:
La fonction Main ne connaît pas le type de l'animal et dépend du comportement d'une implémentation particulière de la méthode MakeNoise ().
Edit: On dirait que Brian m'a battu au punch. Drôle, nous avons utilisé le même exemple. Mais le code ci-dessus devrait aider à clarifier les concepts.
la source
La surcharge et la surcharge sont utilisées pour obtenir le polymorphisme.
Vous pouvez avoir une méthode dans une classe qui est remplacée dans une ou plusieurs sous-classes. La méthode fait des choses différentes selon la classe utilisée pour instancier un objet.
Vous pouvez également avoir une méthode surchargée avec deux ou plusieurs ensembles d'arguments. La méthode fait différentes choses en fonction du ou des types d'arguments passés.
la source
Vous avez raison, la surcharge n'est pas la réponse.
Ni l'un ni l'autre ne l'emporte. Le dépassement est le moyen par lequel vous obtenez le polymorphisme. Le polymorphisme est la capacité d'un objet à varier le comportement en fonction de son type. Cela est mieux démontré lorsque l'appelant d'un objet qui présente un polymorphisme ne sait pas de quel type spécifique il s'agit.
la source
Dire spécifiquement que la surcharge ou la surcharge ne donne pas l'image complète. Le polymorphisme est simplement la capacité d'un objet à spécialiser son comportement en fonction de son type.
Je ne serais pas d'accord avec certaines des réponses ici dans la mesure où la surcharge est une forme de polymorphisme (polymorphisme paramétrique) dans le cas où une méthode du même nom peut se comporter différemment et donner différents types de paramètres. Un bon exemple est la surcharge de l'opérateur. Vous pouvez définir "+" pour accepter différents types de paramètres - disons des chaînes ou des int - et en fonction de ces types, "+" se comportera différemment.
Le polymorphisme comprend également l'héritage et les méthodes de substitution, bien qu'ils puissent être abstraits ou virtuels dans le type de base. En termes de polymorphisme basé sur l'héritage, Java ne prend en charge que l'héritage de classe unique, ce qui limite son comportement polymorphe à celui d'une seule chaîne de types de base. Java prend en charge la mise en œuvre de plusieurs interfaces qui est encore une autre forme de comportement polymorphe.
la source
Le polymorphisme signifie simplement "plusieurs formes".
Il ne nécessite PAS d'héritage pour atteindre ... car l'implémentation d'interface, qui n'est pas du tout un héritage, répond à des besoins polymorphes. On peut soutenir que la mise en œuvre de l'interface répond à des besoins polymorphes «meilleurs» que l'héritage.
Par exemple, créeriez-vous une super-classe pour décrire tout ce qui peut voler? Je ne devrais pas penser. Vous seriez mieux servi pour créer une interface qui décrit le vol et en rester là.
Ainsi, comme les interfaces décrivent le comportement et que les noms de méthode décrivent le comportement (pour le programmeur), il n'est pas trop compliqué de considérer la surcharge de méthode comme une forme moindre de polymorphisme.
la source
L'exemple classique, les chiens et les chats sont des animaux, les animaux ont la méthode makeNoise. Je peux parcourir une série d'animaux appelant makeNoise sur eux et m'attendre à ce qu'ils y fassent leur implémentation respective.
Le code appelant n'a pas besoin de savoir de quel animal il s'agit.
C'est ce que je pense du polymorphisme.
la source
Le polymorphisme est la capacité d'un objet à apparaître sous plusieurs formes. Cela implique d'utiliser l'héritage et les fonctions virtuelles pour construire une famille d'objets qui peuvent être échangés. La classe de base contient les prototypes des fonctions virtuelles, éventuellement non implémentées ou avec des implémentations par défaut selon l'application, et les différentes classes dérivées les implémentent chacune différemment pour affecter différents comportements.
la source
Ni:
La surcharge est lorsque vous avez le même nom de fonction qui prend différents paramètres.
Le dépassement est lorsqu'une classe enfant remplace la méthode d'un parent par l'une des siennes (cela ne constitue pas en soi un polymorphisme).
Le polymorphisme est une liaison tardive, par exemple, les méthodes de la classe de base (parent) sont appelées mais pas avant que l'application ne sache quel est l'objet réel - il peut s'agir d'une classe enfant dont les méthodes sont différentes. En effet, n'importe quelle classe enfant peut être utilisée lorsqu'une classe de base est définie.
En Java, vous voyez beaucoup de polymorphisme avec la bibliothèque de collections:
List est la classe de base, le compilateur n'a aucune idée si vous comptez une liste liée, un vecteur, un tableau ou une implémentation de liste personnalisée, tant qu'il agit comme une liste:
Si vous surchargiez, vous auriez:
et la version correcte de countStuff () serait choisie par le compilateur pour correspondre aux paramètres.
la source
Bien que le polymorphisme soit déjà expliqué en détail dans cet article, mais j'aimerais mettre davantage l'accent sur pourquoi une partie de celui-ci.
Essayons de construire une application simple pour un téléviseur avec et sans héritage / polymorphisme. Postez chaque version de l'application, nous faisons une petite rétrospective.
Supposons que vous êtes ingénieur logiciel dans une société de télévision et que vous soyez invité à écrire un logiciel pour les contrôleurs de volume, de luminosité et de couleur afin d'augmenter et de diminuer leurs valeurs sur commande de l'utilisateur.
Vous commencez par écrire des cours pour chacune de ces fonctionnalités en ajoutant
Vous avez maintenant notre première version d'application fonctionnelle prête à être déployée. Il est temps d'analyser le travail accompli jusqu'à présent.
Vous décidez de vivre avec cela aussi longtemps que votre application fonctionne comme prévu.
Vous commencez à écrire une nouvelle classe (ResetFunctionV2) pour la nouvelle fonctionnalité et mappez le code de mappage d'entrée utilisateur pour cette nouvelle fonctionnalité.
Vous avez donc votre application prête avec la fonction de réinitialisation. Mais maintenant, vous commencez à réaliser que
Maintenant, vous commencez à penser que cette nouvelle fonctionnalité à ajouter ressemble à la fonction de réinitialisation et les problèmes d'application (V2) seront multipliés si vous ne remodelez pas votre application.
Vous commencez à penser à utiliser l'héritage pour pouvoir profiter de la capacité polymorphe de JAVA et vous ajoutez une nouvelle classe abstraite (ControllerV3) à
Grâce à ces améliorations, vous disposez de la version 3 de votre application TV.
Bien que la plupart des problèmes répertoriés dans la liste des problèmes de V2 aient été résolus, sauf
Encore une fois, vous pensez à résoudre ce problème, car vous avez maintenant une autre fonctionnalité (mise à jour du pilote au démarrage) à implémenter également. Si vous ne le corrigez pas, il sera également répliqué vers de nouvelles fonctionnalités.
Donc, vous divisez le contrat défini dans la classe abstraite et écrivez 2 interfaces pour
Et demandez à votre 1ère classe concrète de les implémenter comme ci-dessous
J'espère que cela t'aides :-)
la source
Le terme surcharge désigne le fait d'avoir plusieurs versions de quelque chose avec le même nom, généralement des méthodes avec différentes listes de paramètres
Ces fonctions peuvent donc faire la même chose, mais vous avez la possibilité de l'appeler avec un ID ou un nom. N'a rien à voir avec l'héritage, les classes abstraites, etc.
Le remplacement fait généralement référence au polymorphisme, comme vous l'avez décrit dans votre question
la source
la surcharge est lorsque vous définissez 2 méthodes avec le même nom mais des paramètres différents
la substitution est l'endroit où vous modifiez le comportement de la classe de base via une fonction du même nom dans une sous-classe.
Le polymorphisme est donc lié à la surcharge mais pas vraiment à la surcharge.
Cependant, si quelqu'un me donnait une réponse simple "prioritaire" à la question "Qu'est-ce que le polymorphisme?" Je voudrais des explications supplémentaires.
la source
remplacer est plus comme cacher une méthode héritée en déclarant une méthode avec le même nom et la même signature que la méthode de niveau supérieur (super méthode), cela ajoute un comportement polymorphe à la classe. en d'autres termes, la décision de choisir la méthode de niveau à appeler sera prise au moment de l'exécution et non au moment de la compilation. cela conduit au concept d'interface et d'implémentation.
la source
De Java tutoriel
La définition par dictionnaire du polymorphisme fait référence à un principe de la biologie dans lequel un organisme ou une espèce peut avoir de nombreuses formes ou stades différents. Ce principe peut également être appliqué à la programmation orientée objet et aux langages comme le langage Java. Les sous-classes d'une classe peuvent définir leurs propres comportements uniques tout en partageant certaines des mêmes fonctionnalités de la classe parente.
En considérant les exemples et la définition, la réponse prioritaire devrait être acceptée.
Concernant votre deuxième requête:
Cela devrait être appelé prioritaire.
Jetez un œil à cet exemple pour comprendre les différents types de substitution.
super.methodName()
comme première instructionextrait de code:
production:
la source
Je pense que vous mélangez des concepts. Le polymorphisme est la capacité d'un objet à se comporter différemment au moment de l'exécution. Pour y parvenir, vous avez besoin de deux conditions:
Cela dit, la surcharge signifie quelque chose de différent à remplacer selon la langue que vous utilisez. Par exemple, en Java, il n'existe pas de surcharge mais de surcharge . Les méthodes surchargées avec une signature différente de sa classe de base sont disponibles dans la sous-classe. Sinon, ils seraient remplacés (veuillez voir que je veux dire maintenant qu'il n'y a aucun moyen d'appeler votre méthode de classe de base depuis l'extérieur de l'objet).
Cependant, en C ++, ce n'est pas le cas. Toute méthode surchargée , indépendamment du fait que la signature soit la même ou non (quantité différente, type différent) est également remplacée . C'est-à-dire qu'aujourd'hui, la méthode de la classe de base n'est plus disponible dans la sous-classe lorsqu'elle est appelée de l'extérieur de l'objet de la sous-classe, évidemment.
Donc, la réponse est quand on parle de surcharge d' utilisation de Java . Dans tout autre langage peut être différent comme cela arrive en c ++
la source
Le polymorphisme est plus probable dans la mesure où il signifie ... à OVERRIDING en java
Il s'agit du comportement différent de l'objet SAME dans différentes situations (en programmation, vous pouvez appeler différents ARGUMENTS)
Je pense que l'exemple ci-dessous vous aidera à comprendre ... Bien que ce ne soit pas du code java PURE ...
Mais si nous changeons l'ARGUMENT ... le COMPORTEMENT sera changé ...
La Personne (ici l '"Objet") est la même ...
la source
Le polymorphisme est une implémentation multiple d'un objet ou vous pourriez dire plusieurs formes d'un objet. disons que vous avez une classe
Animals
comme classe de base abstraite et qu'elle a une méthode appeléemovement()
qui définit la façon dont l'animal se déplace. Maintenant, en réalité, nous avons différents types d'animaux et ils se déplacent différemment ainsi certains d'entre eux avec 2 pattes, d'autres avec 4 et certains sans pattes, etc. Pour définir différentsmovement()
de chaque animal sur terre, nous devons appliquer le polymorphisme. Cependant, vous devez définir plus de classes, c'est- à- dire la classe pour y parvenir. Le mot-clé ici est prioritaire, la surcharge est différente et n'est pas considérée comme du polymorphisme. en cas de surcharge, vous pouvez définir plusieurs méthodes "du même nom" mais avec des paramètres différents sur le même objet ou la même classe.Dogs
Cats
Fish
etc. Ensuite, vous devez étendre ces classes à partir de la classe de baseAnimals
et remplacer sa méthodemovement()
avec une nouvelle fonctionnalité de mouvement basée sur chaque animal que vous avez. Vous pouvez aussi utiliserInterfaces
la source
Le polymorphisme concerne la capacité d'un langage à avoir un objet différent traité de manière uniforme en utilisant une seule interface; en tant que tel, il est lié à la substitution, de sorte que l'interface (ou la classe de base) est polymorphe, l'implémenteur est l'objet qui remplace (deux faces de la même médaille)
de toute façon, la différence entre les deux termes est mieux expliquée en utilisant d'autres langages, tels que c ++: un objet polymorphe en c ++ se comporte comme l'équivalent java si la fonction de base est virtuelle, mais si la méthode n'est pas virtuelle, le saut de code est résolu statiquement , et le vrai type n'étant pas vérifié au moment de l'exécution, le polymorphisme inclut la possibilité pour un objet de se comporter différemment selon l'interface utilisée pour y accéder; permettez-moi de faire un exemple en pseudocode:
(en supposant que makeRumor n'est PAS virtuel)
java n'offre pas vraiment ce niveau de polymorphisme (appelé aussi découpage d'objets).
animal a = nouveau chien (); chien b = nouveau chien ();
dans les deux cas, il n'imprimera que woff .. puisque a et b font référence à un chien de classe
la source
la source