..
Ο πολυμορφισμός είναι μια τεχνική προγραμματισμού που επιτρέπει τη χρήση τμημάτων του πηγαίου κώδικα, ενώ παραμένουν αμετάβλητες, για τη δημιουργία χρόνου εκτέλεσης συμπεριφορές.
Δημιουργία πολυμορφικό κώδικας έχει μια συγκεκριμένη σημασία στον αντικειμενοστρεφή προγραμματισμό: αυτό σημαίνει τη δημιουργία ενός ταξινόμηση όλων των τάξεων που εφαρμόζουν μια διεπαφή.
Έτσι, αν, για παράδειγμα, διασύνδεση μου καθορίζει μια μέθοδο "getArea", κάθε τάξη που θα θέσει σε εφαρμογή αυτή η διασύνδεση θα έχει μια μέθοδο "getArea": αυτό μας επιτρέπει να γράφετε πολυμορφικό, μεθόδους που μπορούν να αλλάξουν την εκτέλεση αλγορίθμου τους Ανάλογα με τον τύπο του αντικειμένου που έχει περάσει ως επιχείρημα.
Πολυμορφισμός στο παραδοσιακό γλώσσες OOP
Στην Java - αλλά το ίδιο ισχύει και για την C + + και οποιαδήποτε άλλη γλώσσα, Αντικειμενοστραφής (OO) ολοκληρώθηκε, θα το χέρι στη συνέχεια την υπόθεση της Ruby - για παράδειγμα:
διεπαφή IFormaGeometrica
{
άκυρη getArea ()?
}
δημόσια τάξη Τρίγωνο υλοποιεί IFormaGeometrica
{
@ Παράκαμψη
δημόσια int getArea ()
{
επιστροφή (* this.base this.altezza) / 2?
}
}
Σε αυτή την περίπτωση ορίζουμε το περιβάλλον IFormaGeometrica οποίο αναφέρει ότι κάθε αντικείμενο που "είναι" ένα FormaGeometrica getArea θα έχει μια μέθοδο - όπως η τάξη Τρίγωνο, η οποία είναι μια FormaGeometrica, έχει τη δική του εκτέλεση του getArea, η οποία μας επιτρέπει να γράψετε ένα πρόγραμμα σε θέση να υπολογίσει το εμβαδόν κάθε γεωμετρικό σχήμα, αν αυτό είναι πλέον παρούσα στη κώδικα και ότι θα εφαρμοστεί στο μέλλον, χωρίς να αλλάξει το αρχικό πηγαίο κώδικα.
Στην πραγματικότητα, αν γράφω μια αριθμομηχανή κατηγορίας:
δημόσια τελικό Υπολογιστής τάξη
{
δημόσια στατική άκυρη κύρια (String [] args)
{
Εντύπων συλλογής <IFormaGeometrica> =
<IFormaGeometrica> Νέα ArrayList ()?
forme.add (νέο τρίγωνο ())?
forme.add (νέα πλατεία ())?
forme.add (νέα Πενταγώνου ())?
για (IFormaGeometrica g: έντυπο)
{
System.out.println (g.calcolaArea ())?
}
}
}
Αυτό μπορεί να πάρει ως είσοδο οποιαδήποτε συλλογή των γεωμετρικών σχημάτων, με την προϋπόθεση ότι κάθε αντικείμενο της συλλογής πρέπει να εφαρμόσει το interface IFormaGeometrica, και ότι έχει κατ 'εξοχήν getArea μέθοδο.
Αυτό το παράδειγμα σε Java είναι καθαρά ακαδημαϊκή: στην πραγματικότητα, κατά πάσα πιθανότητα στον constructor της κάθε κατηγορίας, που θα περιλαμβάνει μέτρα με είσοδο από τις πλευρές του γεωμετρικού σχήματος, του βάρους, και ούτω καθεξής.
Ο στόχος επιτυγχάνεται: γράψαμε μια κατηγορία που μπορεί να εκτυπώσει σε βίντεο το εμβαδόν κάθε γεωμετρικό σχήμα. Επαναλαμβάνω: αυτό είναι ο κωδικός που έχει ήδη τεθεί σε εφαρμογή (όπως στην περίπτωση του τριγώνου), το οποίο υλοποιείται στο μέλλον.
Όχι μόνο: εάν η εφαρμογή του υπολογισμού της περιοχής Τριγώνου περιείχε ένα σφάλμα, μπορώ να αλλάξω την τάξη χωρίς να χρειάζεται να ξαναγράψουμε το Τρίγωνο Αριθμομηχανή τάξη. Ίσως αναπτύχθηκε σε ένα διακομιστή που πρέπει να κάνει επανεκκίνηση κάθε αλλαγή: στην περίπτωση αυτή δεν χρειάζεται να αλλάξετε τον κωδικό είναι ένα σημαντικό πλεονέκτημα. Αλλά εκτός από αυτό, είναι πάντα συμφέρουσα για τον περιορισμό των τμημάτων του κώδικα που «αλλαγή», επειδή κάθε αλλαγή που φέρνει με το δυναμικό σφάλματα. Αντίθετα, είναι μια καλή πρακτική προγραμματισμού για πάντα γνωρίζουμε με βεβαιότητα ποια τμήματα του κώδικα που παραμένουν αμετάβλητες.
Τι συμβαίνει "πίσω από τα παρασκήνια" είναι ότι ο compiler εξασφαλίζει ότι κάθε αντικείμενο στον πολυμορφικό κώδικα η κύρια μέθοδος της κλάσης Υπολογιστής υλοποιεί το περιβάλλον. Με αυτόν τον τρόπο, λένε ότι είναι μια έκφραση χρησιμοποιώντας τη μεθοδολογία του σχεδιασμού από τη σύμβαση, «η σύμβαση είναι σεβαστή."
Αν όχι, αν αυτό είναι σε «έντυπα» έχουν ένα αντικείμενο μιας κλάσης που δεν θα εφαρμόσουν IFormaGeometrica ένα λάθος κατά τη μεταγλώττιση, ή δεν καταφέρει να τρέξει το πρόγραμμα, επειδή ο compiler θα παρατηρήσετε το σφάλμα.
Ο πολυμορφισμός σε Ruby
Αλλά τι συμβαίνει σε Ruby; Και «είναι δυνατόν σε Ruby, που δεν έχουν δημιουργηθεί, αλλά ερμηνεύεται γλώσσα, γραφή πολυμορφικό μεθόδους;
Ναι, είναι σίγουρα εφικτή, αλλά υπάρχει μια μεγάλη διαφορά "φιλοσοφική" από OO γλώσσες και καταρτίζονται, η οποία
θα μπορούσαμε να το περιγράψω. OO προγραμματισμού Java και το κλασικό, να αποδείξει ότι ένα αντικείμενο ανήκει σε ένα συγκεκριμένο τύπο αντικειμένων (που υλοποιεί ένα συγκεκριμένο interface) πρέπει να αντίρρησης σε ό, προέρχεται από μια κλάση γονέα: βασικά θα πρέπει να χρησιμοποιήσετε τις τεχνικές της κληρονομιάς (κληρονομώντας από μια τάξη, μια αφηρημένη κλάση ή μια διεπαφή).
Θα ήταν σαν να λέμε: Για να προσδιορίσετε αν αυτό είναι μια πάπια μπροστά μου, παίρνω το DNA και τη μελέτη του στο εργαστήριο για να δείτε αν είναι να πάπια.
Στη Ruby χρησιμοποιείτε το "τεστ πάπια» (δοκιμή πάπια) εφευρέθηκε από τον James Riley (βλέπε http://en.wikipedia.org/wiki/Duck_typing ):
Αν περπατάει σαν πάπια και οι απατεώνες σαν πάπια, τότε είναι μια πάπια.
(Η οποία παρεμπιπτόντως είναι αυτό που κάνει ο καθένας μας όταν βλέπει μια πάπια).
Τι σημαίνει αυτό; Αυτό σημαίνει ότι στη Ruby, και γενικότερα σε αντικειμενοστραφείς γλώσσες προγραμματισμού, καθώς επίσης και Python και Perl, δεν χρειάζεται να καθορίσετε το περιβάλλον, ούτε ρητή σχέσεις κληρονομικότητας μεταξύ των τάξεων.
Ο διερμηνέας απλά "εμπιστοσύνη" ότι τον προγραμματιστή, η μέθοδος βήματα όταν ένα πολυμορφικό αντικείμενο που «πρέπει να έχει" ένα συγκεκριμένο τρόπο, έχουμε πραγματικά την.
| |
Ruby και Ruby on Rails (Μάθημα)
Δημιουργία λογισμικού και Web εφαρμογές με Ρουμπίνι και RoR. Από 39 €. |