Πολυμορφισμός υποτύπων: Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
Stergios.ntua (συζήτηση | συνεισφορές)
Χωρίς σύνοψη επεξεργασίας
Γραμμή 1:
Στην [[θεωρία γλωσσών προγραμματισμού]], '''πολυμορφισμός υποτύπων''' είναι μια μορφή [[πολυμορφισμός τύπων|πολυμορφισμού τύπων]] στην οποία ένας '''υποτύπος''' είναι ένας [[τύπος δεδομένων]] που σχετίζεται σε έναν άλλο τύπο δεδομένων (τον '''υπερτύπο''') με ενός είδους [[αντικαταστασιμότητα|αντικαταστασιμότητας]], πράγμα που σημαίνει ότι οι δομές του προγράμματος, συνήθως [[υπορουτίνα|υπορουτίνες]] ή συναρτήσεις που γράφτηκαν για να λειτουργούν πάνω σε στοιχεία του υπερτύπου μπορούν επίσης να λειτουργήσουν με τα στοιχεία του υποτύπου. Αν S είναι ένας υποτύπος του Τ, η [[δυαδική σχέση|σχέση]] υποτύπου γράφεται συχνά S <: Τ, που σημαίνει ότι οποιοσδήποτε όρος του τύπου S μπορεί "να χρησιμοποιηθεί με ασφάλεια σε ένα πλαίσιο όπου" αναμένεται ένας όρος του τύπου Τ. Οι ακριβής σημασιολογία του πολυμορφισμού υποτύπων εξαρτάται σε μεγάλο βαθμό από το τι ακριβώς σημαίνει "μπορεί να χρησιμοποιηθεί με ασφάλεια σε ένα πλαίσιο όπου" σε μία δεδομένη [[γλώσσα προγραμματισμού]]. Το [[σύστημα τύπων]] μιας γλώσσας προγραμματισμού καθορίζει ουσιαστικά τη δική του σχέση υποκατηγοριών, η οποία μπορεί κάλλιστα να είναι [[ταυτοτική συνάρτηση|τετριμμένη]].
 
Επειδή η σχέση υποτύπου επιτρέπει ένας όρος να έχει (ανήκει σε) περισσότερους από έναν τύπο, οι υποτύποι είναι μια μορφή του [[πολυμορφισμού τύπων]], για αυτό ονομάζεται (ορθότερα) πολυμορφισμός υποτύπων. Στον [[αντικειμενοστρεφήςΑντικειμενοστραφής προγραμματισμός|αντικειμενοστρεφήαντικειμενοστραφή προγραμματισμό]], η σχέση υποτύπου ονομάζεται συχνά απλά "πολυμορφισμός" (βλ. [[πολυμορφισμός υποτύπων]]). Η σχέση υποτύπου δεν ονομάζεται σχεδόν ποτέ έτσι στην [[θεωρία τύπων]] ή στον [[συναρτησιακός προγραμματισμός|συναρτησιακό προγραμματισμό]], όπου απλώς ο όρος "πολυμορφισμός" αναφέρεται συνήθως σε [[παραμετρικός πολυμορφισμός|παραμετρικό πολυμορφισμό]], όπως στον [[πολυμορφικός λογισμός λάμβδα|πολυμορφικό λογισμό λάμβδα]]. (Μηχανισμοί με παρόμοιο στόχο, αλλά μη ταυτόσημοι με τον παραμετρικό πολυμορφισμό, είναι γνωστοί με άλλα ονόματα στον αντικειμενοστρεφή προγραμματισμό, π.χ. [[γενικοί τύποι στη Java]] ή [[Πρότυπο (προγραμματισμός)|πρότυπα σε C++]].)
 
Οι [[συναρτησιακές γλώσσες προγραμματισμού]] συχνά επιτρέπουν τη λειτουργία υποτύπων σε [[Εγγραφή (γλώσσες προγραμματισμού)|εγγραφές]]. Κατά συνέπεια, ο [[λ-λογισμός με απλούς τύπους|λ-λογισμός με απλό σύστημα τύπων]] επεκτεταμένος με τύπους εγγραφών είναι ίσως το πιο απλό θεωρητικό πλαίσιο στο οποίο μπορεί να οριστεί και να μελετηθεί κάποια χρήσιμη έννοια υποτύπου. Επειδή ο προκύπτων λογισμός επιτρέπει όρους που έχουν περισσότερους από έναν τύπο, δεν είναι πλέον μία "απλή" [[θεωρία τύπων]]. Δεδομένου ότι οι συναρτησιακές γλώσσες προγραμματισμού εξ' ορισμού υποστηρίζουν [[ανώνυμες συναρτήσεις]], που μπορούν επίσης να αποθηκεύονται σε εγγραφές, οι εγγραφές εφοδιασμένες με τη λειτουργία υποτύπου παρέχουν ορισμένα από τα χαρακτηριστικά του αντικειμενοστρεφούςαντικειμενοστραφούς προγραμματισμού (εκτός αν προστεθούν στη γλώσσα αναφορές, αυτά τα "αντικείμενα" είναι [[αμετάβλητα αντικείμενα|αμετάβλητα]]). Συνήθως, οι συναρτησιακές γλώσσες προγραμματισμού παρέχουν επίσης κάποια, συνήθως περιορισμένη, μορφή παραμετρικού πολυμορφισμού. Σε ένα θεωρητικό πλαίσιο, είναι σκόπιμο να μελετήσει κανείς την αλληλεπίδραση των δύο χαρακτηριστικών. Ένα κοινό θεωρητικό πλαίσιο είναι το [[σύστημα F-sub|σύστημα F<sub><:</sub>]]. Διάφοροι λογισμοί που επιχειρούν να συλλάβουν τις θεωρητικές ιδιότητες του αντικειμενοστρεφούςαντικειμενοστραφούς προγραμματισμού μπορεί να προκύψουν από το σύστημα F<sub><:</sub>.
 
Η έννοια των υποτύπων σχετίζεται με τις γλωσσικές έννοιες της [[υπερνυμία|υπερνυμίας]] και [[ολονυμία|ολονυμίας]]. Συνδέεται επίσης με την έννοια της [[φραγμένη ποσοτικοποίηση|φραγμένης ποσοτικοποίησης]] στη μαθηματική λογική. Οι υποτύποι δεν πρέπει να συγχέονται με την έννοια της [[κληρονομικότητα (επιστήμη υπολογιστών)|κληρονομικότητας]] (κλάσεων ή αντικειμένων) των αντικειμενοστρεφών γλώσσών. Η σχέση υποτύπου είναι μια σχέση μεταξύ τύπων (διαπροσωπειών σε αντικειμενοστρεφέςαντικειμενοστραφές ιδίωμα), ενώ η κληρονομικότητα είναι μία σχέση μεταξύ υλοποιήσεων, που προκύπτει από μια κάποιο χαρακτηριστικό της γλώσσας το οποίο επιτρέπει σε νέα αντικείμενα να δημιουργηθούν από υπάρχοντα. Σε ορισμένες αντικειμενοστρεφείς γλώσσες, η σχέση υποτύπων καλείται '''κληρονομικότητα διαπροσωπειών'''. <!-- Todo προσθέστε το διορατικό παράδειγμα του Mitchell με στοίβα/ουρά/dequeue -->
 
== Προέλευση ==
Η έννοια των υποτύπων στις γλώσσες προγραμματισμού χρονολογείται από τη δεκαετία του 1960. Εισήχθη στη [[Simula]] και τους απογόνους της. Οι πρώτες τυπικές αναλύσεις των υποτύπων δόθηκαν από τον [[John C. Reynolds]] το 1980, ο οποίος χρησιμοποίησε [[θεωρία κατηγοριών]] για την τυποποίηση της [[έμμεση μετατροπή|έμμεσης μετατροπής]], και τον [[Luca Cardelli]] (1985).<ref>Pierce, σημειώσεις κεφ. 15</ref>
 
Η έννοια των υποτύπων έχει αποκτήσει μεγαλύτερη αναγνωρισιμότητα (και συνωνυμία με τον πολυμορφισμό σε μερικούς κύκλους) με την ευρύτατη υιοθέτηση του αντικειμενοστρεφούςαντικειμενοστραφούς προγραμματισμού. Στο πλαίσιο αυτό, η αρχή της ασφαλούς υποκατάστασης συχνά ονομάζεται [[αρχή της υποκατάστασης κατά Liskov]], προς τιμή της [[Barbara Liskov]] η οποία την έκανε δημοφιλή σε μία [[εναρκτήρια ομιλία]] της σε συνέδριο για τον αντικειμενοστρεφήαντικειμενοστραφή προγραμματισμό το 1987. Επειδή πρέπει να λάβει υπόψη τη μεταβλητότητα των αντικειμένων, η ιδανική έννοια του υποτύπου όπως ορίζεται από τη Liskov και τη [[Jeannette Wing]] και ονομάζεται [[συμπεριφορική σχέση υποτύπου]] είναι υπερβολικά ισχυρή για να μπορέσει να υλοποιηθεί σε έναν [[ελεγκτής τύπων|ελεγκτή τύπων]]. (Δείτε το τμήμα σχετικά με τους τύπους συναρτήσεων για λεπτομέρειες.)
 
== Παραδείγματα ==
Γραμμή 82:
* [[Παραμετρικός πολυμορφισμός]]
* [[Πολυμορφισμός (επιστήμη υπολογιστών)]]
* [[Πολυμορφισμός στον αντικειμενοστρεφήαντικειμενοστραφή προγραμματισμό]] για μια πιο ήπια εισαγωγή σε αυτή την έννοια
 
==Σημειώσεις==
Γραμμή 104:
[[Κατηγορία:Τύποι δεδομένων]]
[[Κατηγορία:Πολυμορφισμός (υπολογιστές)]]
[[Κατηγορία:ΑντικειμενοστρεφήςΑντικειμενοστραφής προγραμματισμός]]
 
{{ενσωμάτωση κειμένου|en|Subtype Polymorphism }}