Quelle est la différence entre l'Abstraction et le Polymorphisme
Je semblez ne pas comprendre deux concepts de programmation orientée objet très bien. Pourriez-vous expliquer ce abstraction et polymorphisme sont, de préférence, avec des exemples réels et le code?
Merci.
- Je ne pense pas que ça sonne comme des devoirs, je dirais qu'il/elle est juste avoir du mal à comprendre.
- Ce n'est pas de devoirs, mais juste quand j'ai été discuter avec mon équipe, ces concepts s'est un peu similaire. C'est pourquoi ils me rendent confus. L'Abstraction se réfère à aucun détail spécifique de quelque chose, et le Polymorphisme se réfère à des méthodes d'objets différents ont le même, mais le faire différentes tâches. Suis-je le droit?
Vous devez vous connecter pour publier un commentaire.
Abstraction
Imaginer une fraction de la classe:
Maintenant deux objets: l'
Les deux objets ont la valeur 1:
(1/1) == (-1)/(-1)
. Vous ne vous attendriez pas ils se comportent de façon différente à l'extérieur. C'est l'abstraction. Vous résumé les données de votre objet tient dans une vue logique, même tho derrière les coulisses, il ya d'autres choses. En théorie, vous avez eu une relation d'équivalence, avec différents équivalence des groupes:Et il est une abstraction de la fonction qui fait abstraction de l'intérieur les détails à l'extérieur:
Il cartes de béton valeurs de la résumé valeurs d'un objet. Vous le faire en écrivant, par exemple, un constructeur de cartographie (-1, -1), (1, 1) et par la rédaction d'un égal fonction de votre classe.
Polymorphisme
Imaginer un stylo et deux classes dérivées:
Deux stylos peut en tirer. votre "plume" ne peut pas tirer de lui-même. C'est juste une interface pour pen_thin, pen_thick et beaucoup d'autres stylos. Vous dites: obj1.tirage au sort(1, 0); et si obj1 est épaisse ou une fine plume n'est pas question pour vous en tant qu'utilisateur, ni pour le compilateur au moment de la compilation. L'appel se comporte polymorphes. C'est dynamique polymorphisme (qui se passe à l'exécution) et qu'est ce qu'on entend habituellement. Polymorphisme statique qui se passe au moment de la compilation:
Qu'on appelle la surcharge. Vous appelez
obj.colorize(something)
. Si vous l'appelez, avec un t-shirt de référence, il va appeler la version prenant une chemise. Et si vous l'appelez, avec un pantalon de référence, il va appeler le pantalon version. Le choix fait ici est de au moment de la compilation.Ces deux-là sont parmi les caractéristiques les plus importantes de paradigme Orienté Objet.
L'Abstraction.
L'orientation de l'objet des modèles du logiciel comme de véritables objets du monde. Cependant, il serait trop difficile ( et inutile ) pour le modèle de TOUTES les propriétés d'un Client peut être, ou toutes les propriétés d'un Employé.
En listant uniquement les attributs intéressants d'un objet OO peut effectivement utiliser cet objet pour un domaine spécifique. C'est l'abstraction.
Par exemple, un Employé dans un système de RH peuvent avoir des attributs très différents qu'une Librairie en Ligne. Nous avons résumé les détails pour faire est utile.
Polymorphisme.
Objets peuvent se comporter différemment en fonction du "type" tout en gardant la même interface.
Ce que cela veut dire?
Par exemple une boutique en ligne peut avoir deux sous-classes de l'Employé
A) les employés Internes.
B) Les Entrepreneurs
Et une méthode de calcul de la réduction pour les internes achats
La remise d'un employé interne est calculé comme suit: 10% + 2% pour chaque année de la société + 2% pour chaque.. mmhh enfant
La remise d'un entrepreneur est de 10%
Le code suivant pour calculer le montant à payer:
Serait de produire des résultats différents pour les deux types d'Employé-e 's
C'est le polymorphisme. Au lieu d'avoir quelque chose comme
Nous laisser l'exécution de choisir celui à calculer. C'est comme le programme se comporte différemment selon le type:
Par la façon dont, dans cet exemple, le "Montant" est une abstraction d'un véritable concept, qui pourrait également être représenté comme un double ou un Entier, mais nous avons peut-être interestion méthodes à l'intérieur que ce serait mieux si dans sa propre classe.
J'espère que cette aide.
L'Abstraction et le polymorphisme sont des concepts essentiels en aucun cas limité à OO. Ajoutant à la confusion, le mot "abstraction" est utilisé de multiples façons. Voici une petite feuille de triche avec un exemple:
Abstraction de données signifie se cacher de l'information. Généralement ce qui est caché est la représentation d'une structure de données. Exemple: - je mettre en œuvre des ensembles, mais je ne peux pas te dire si un jeu est représenté par une liste, un arbre binaire équilibré ou déséquilibré arbre binaire. Fait à droite, je peux changer la représentation sans casser votre code.
Polymorphisme signifie réutiliser avec différents types. Donc, avec mon set exemple, vous pouvez créer des ensembles de numéros de Sécurité Sociale, des ensembles de noms, ou des ensembles de fruitbats, tout en utilisant le même code.
Évidemment, vous pouvez définir une classe qui est à la fois abstrait et polymorphe.
Polymorphisme est plus à confusion, car il y a deux façons de mettre en œuvre le polymorphisme. Dans polymorphisme paramétrique, vous pouvez réutiliser l'ensemble avec des valeurs de tout type, ou peut-être tout type de satisfaire certaines contraintes. Le la plupart des exemples les plus évidents, sont modèles C++; si vous écrivez
Puis
T
est le type des objets contenus dans l'ensemble (la notation<T>
indique un soi-disant "type de paramètre", qui est ce qui le rend paramétrique polymorphisme).Dans sous-type de polymorphisme, vous pouvez réutiliser les jeux qu'avec des objets dont les types sont des sous-types d'un type particulier. Par exemple, vous pourriez être en mesure de faire des séries uniquement des objets qui offrent une moins-que-ou-égal-à la méthode. Dans un vrai langage orienté objet comme Smalltalk ou Ruby, qui offrent des soi-disant duck-typing (us pointu dirigé les théoriciens appellent parfois il de sous-typage comportemental), la présence de la méthode est assez bon. Dans un langage comme Java ou C++, qui un amalgame entre les sous-typage avec l'héritage, votre utilisation du polymorphisme peut être limité aux sous-classes d'une classe particulière. (Java davantage confond le problème en utilisant une forme de sous-typage sur les classes et un autre sur les interfaces.)
Enfin, les vieux cons comme moi de parler de procédure d'abstraction, ce qui signifie simplement être en mesure de prendre un tas de déclarations qui sont fréquemment utilisés ensemble et plop dans une procédure ou une méthode que vous pouvez ensuite réutiliser. Ce n'est probablement pas pertinente à votre question.
Alors, ne vous sentir mieux à propos de la confusion?
L'Abstraction se réfère à l'acte de représenter l'essentiel des caractéristiques sans fond y compris des détails ou des explications. Classes d'usage de la notion d'abstraction et sont définies par une liste d'attributs abstraits.
Un exemple d'un logiciel d'abstraction est de Java
Object.equals(Object o)
méthode. Vous savez qu'il va comparer cet objet à celui transmis en tant que paramètre, mais vous ne savez pas, ni avez-vous besoin de savoir exactement comment il sera mis en place (sauf si vous êtes de le responsable de l'implémentation de la classe).Polymorphisme signifie que la capacité à prendre plus d'une forme. Une méthode peut avoir des comportements différents dans les différentes instances. Le comportement dépend des types de données utilisées dans l'opération.
L'un des exemples classiques de polymorphisme utilise un arbre d'héritage ancré dans l'Animal de la classe. Tous les Animaux ont un
makeNoise()
méthode, mais le Chien de la classe et de la classe Chat en œuvre différemment. Cela vous permet de consulter n'importe quel Chien et du Chat à l'aide d'un Animal de type référence.Maintenant, vous pouvez appeler
makeNoise()
sur un Animal d'instance et de savoir qu'il va faire du bruit. Ceci est particulièrement utile si vous avez une Collection d'Animaux, et vous ne savez pas au moment de l'exécution exactement ce type de chacun d'eux est vraiment.Les deux termes sont utilisés massivement dans la programmation orientée objet, mais ils ne sont pas limitées à ce contexte.
L'Abstraction est une généralisation de quelque chose d'autre; une étape de plus dans la perspective. Une hiérarchie, par exemple, peut être vu comme une abstraction sur la structure organisationnelle de l'entreprise. Il est généralement utilisé dans le contexte de ce que les choses sont en dessous (comme leurs types de base). Le point d'abstraction est d'écrire moins de code, qui est de nature plus générale, de sorte que vous pouvez exécuter pour un plus grand ensemble de problèmes. Une feuille de calcul, par exemple, est une couche d'abstraction qui permet pour un type spécifique de stockage de l'information. Plus?
Polymorphisme est aussi une généralisation, mais celui qui se produit dans un contexte d'exécution. Un tas de différents types d'objets sont polymorphes si il y a un moyen d'y accéder où ils sont indiscernables les uns des autres. C'est, de tous les objets de regarder et se sentir le même, même si ils ne le sont pas. Le but de cette opération est de réduire de façon significative le code; vous pouvez écrire un généralisé solution pour économiser de l'écriture de toutes les permutations différentes pour chaque type différent. Si vous écrivez une bibliothèque graphique, vous préférez simplement écrire du code abstrait à gérer "des formes", puis écrire le code différent pour chaque type, tels que des cercles, des carrés, etc.
Ce sont les deux termes qui sont centrées autour de propriétés dans le code qui va permettre aux programmeurs de faire plus avec moins. Moins de code a moins de bugs, plus stable et plus facile à maintenir. L'alternative consiste à utiliser la "force brute" à livre des millions et des millions de lignes de très particulier et très fragile) de code. Plus le code est plus difficile à corriger, et beaucoup plus difficile à maintenir à jour.
Paul.
réponse courte: l'abstraction est conceptuel, le polymorphisme est comportementale
L'Abstraction et le Polymorphisme sont de nature similaire avec un objectif différent.
Pour ex.
D'un permis de conduire: vous êtes donné une licence de mentionner la classe de véhicules vous êtes autorisé à conduire. La licence mentionne la classe de véhicule autorisé par l'autorité, mais il n'a pas de définir ou de mention spécifique de la voiture ou de la marque vous devez vous rendre. C'est l'Abstraction.
ici Licence est un classe Abstraite et de sa méthode, la permis véhicules est son méthode Abstraite.
Maintenant, ici, le Polymorphisme est différentes façons de Licence individuelle est imparti par l'autorité de différentes personnes, certaines sont émis pour les véhicules légers, tandis que certains lourds et certains sont donnés pour les véhicules commerciaux, selon les différentes exigences. Ici, Licence est une classe de base, et d'autres types de licences sont ses classes enfant, en obéissant aux relation " est-un. Commercial licence est une Licence.
Donc, l'Abstraction est une directive générale en donnant l'indépendance de la mise en œuvre de l'adepte des classes alors que le Polymorphisme est l'approche différentielle, qui l'emportent sur les méthodes/règles définies par la classe parent.
P. S: récemment commencé à apprendre le java réponse se fonde sur mon observation s'il vous plaît corrigez-moi si je me trompe.
L'Abstraction et le Polymorphisme de coeur profond de ne presque le même travail dans la programmation .
Prenons une voiture par exemple..
il n'a pas d'importance si c'est une Ford mini-van, Ferrari exotiques, Land-Rover SUV ou une berline BMW ils suivent tous une conception de base d'une voiture, j'.e un moteur, un volant , une boîte de vitesse , des feux , des indicateurs et la liste continue . elles se distinguent par leurs implémentations spécifiques comme Ferrari pourrait avoir un moteur plus puissant qu'un mini-van, un suv pourrait avoir une autre boîte de vitesse
donc Une voiture (super-classe ici) a été mis en œuvre par les sous-classes (berline, suv , mini-van, exotique)
C'est polymorphisme, une idée de base hérités ou mis en œuvre par l'ajout d'autres spécifications. un 4 roues véhicule (super-classe), mis en œuvre sous des formes diverses (sous-classes)
Maintenant, Abstraction , par définition, il s'agit de cacher les détails et de faire de l'utilisateur de voir ce qui est requis par lui..
Prenons l'exemple de la voiture à nouveau.. Vous utilisez la vitesse, mais vous ne savez pas exactement le mécanisme de la façon dont exactement le fonctionnement du matériel et des changements de vitesse et tout..
Maintenant sur le codage de la Partie.
Les classes abstraites sont incomplets des classes et pour une classe abstraite comme le nom le suggère, ils ont besoin d'avoir un incomplètes méthode qui doit être complété par la sous-classe hérite de la classe mère , S'ils ne terminent pas la méthode abstraite restera incomplète tant que bien.
aussi vous ne pouvez pas créer des objets de classes abstraites parce que la classe n'est pas complète. Pourtant, ces classes abstraites peuvent avoir des méthodes statiques , des arguments , des méthodes concrètes, MAIS pour eux d'être abstraite, ils ont besoin d'une méthode abstraite. Donc une super-classe abstraite est mis en œuvre dans d'autres sous-classes où ils le compléter
En regardant la déclaration de la méthode, nous pouvons estimer ce qu'est exactement la méthode est en train de faire, ce qu'il va revenir. Mais nous ne savons pas exactement comment la méthode abstraite sera mis en œuvre.
Par l'utilisation de classes abstraites et interfaces , nous pouvons atteindre l'abstraction en Java.
Comme nous le savons tous que les classes abstraites, interfaces contient des méthodes abstraites
Nous ne pouvons qu'estimer comment ils vont travailler . Nous savons comment ils fonctionnent, une fois que nous avons fourni la méthode mise en œuvre dans les classes qui implémentent le correspondant de la classe abstraite ou une interface.
DONC, fondamentalement abstrait permet de polymorphisme.
En terme simple, l'Abstraction est conceptuel et le Poly est comportementale. Afin de parvenir à l'abstraction, en programmation orientée objet, vous avez besoin de Poly.
L'Abstraction dans la programmation orientée objet est un concept ou motif de conception que je peut dire, ce qui permet une meilleure isolation, couplage lâche donc la testabilité et la réutilisabilité et l'extensibilité. Pour atteindre l'ensemble, nous avons besoin de poly, héritage/extension et etc.
La confusion quant à la signification réelle de l'abstraction dans le contexte de l'orientation de l'objet est compréhensible: il ajoute peu, si quelque chose, les notions d'héritage, l'encapsulation et même polymorphisme. Si vous maîtrisez ces trois concepts, il n'est pas nécessaire de préoccupation trop avec "l'abstraction" une fois qu'il est naturellement intégré (en particulier l'héritage).
Pour commencer, notez que le terme "abstraction" a plusieurs sens et il n'est pas inexact d'affirmer, par exemple, que l'encapsulation nécessite l'abstraction: lorsque vous utilisez les modificateurs d'accès pour protéger les attributs d'une classe tout en dénonçant les méthodes qui gèrent eux (c'est ce que l'encapsulation est), la catégorie " utilisateur n'a plus besoin de s'inquiéter comment les gérer par elle-même. Donc, dans un sens, lors de la conception d'une classe, vous résumé par l'encapsulation des méthodes et des attributs - tout ce que la classe' utilisateur doit faire est de l'utiliser en invoquant le droit des méthodes, et c'est une forme d'abstraction.
En outre, si vous pensez que tout droit, polymorphisme est aussi une forme d'abstraction: votre code appelle une méthode fournie par un peu de classe et vous n'avez aucune idée de comment il va agir jusqu'à ce que la classe réelle type est déterminé (à l'exécution). Donc, il est correct d'affirmer que le comportement polymorphique est une sorte d'abstraction.
Toutefois, lorsqu'il est utilisé comme une application autonome terme pour décrire les caractéristiques de la programmation orientée objet, abstraction doit être compris que la bonne représentation du système en cours de discussion sous la forme d'une hiérarchie de classe. En tant que tel, l'abstraction est le résultat de la concepteur du processus mentaux qui aboutissent à une conception appropriée pour les classes qui vont être utilisés dans le programme. Pour citer un (excellent!) post qui peut être trouvé à l'javarevisited blog:
Alors que la déclaration ci-dessus est correct, je trouve le "masque les détails" de la partie erronés - je reformuler comme quelque chose comme
Pour être juste avec l'auteur, cette idée même est magnifiquement mis le long de son article. Le terme "abstraction" avec cette connotation est également vu dans des livres comme La tête la Première Analyse Orientée Objet et Design, et je cite une déclaration à partir de là:
Avis l'utilisation de l'abstraction ici: "regarder à l'abstrait que le comportement dans une classe". Maintenant, si à l'abstrait signifie à la conception d'une hiérarchie de classe correctement comme suggéré ci-dessus, l'abstraction peut être défini comme la représentation d'un domaine à l'aide de classes idéalement, profitant des notions d'héritage et de l'encapsulation.
Dans le cas particulier de Java, l'abstraction est mis en œuvre par l'aide de interfaces et les classes abstraites tandis que l'encapsulation est mis en œuvre avec le private, protected et le paquet de modificateurs d'accès.
très facile.
L'Abstraction est l'abstraction. Catégorie "Étudiant" est une abstraction d'un élève réel.
Polymorphisme est quand une classe représente un autre de sorte que l'utilisateur ne remarque pas. Cela peut se produire lorsque les classes implémentent la même interface ou une classe dérive de l'autre. La classe de HighSchoolStudent' est dérivée de la classe de l'Étudiant". Lors de la classe de l'Enseignant "les appels à #la fréquentation de la méthode sur l'objet, il ne pourrait pas savoir si cet objet est de "Étudiant" de la classe ou de "HighSchoolStudent' classe.