Σε Δελφοί, η "διεπαφή" έχει δύο διαφορετικές έννοιες. Σε OOP φρασεολογία, μπορείτε να σκεφτείτε μια διεπαφή ως μια τάξη χωρίς εφαρμογή. Στην ενότητα Διεπαφή ορισμού μονάδων Delphi χρησιμοποιείται για να δηλώσει οποιαδήποτε δημόσια τμήματα του κώδικα που εμφανίζονται σε μια μονάδα. Αυτό το άρθρο εξηγεί τις διεπαφές από την οπτική γωνία του OOP.
Αν είστε στο χέρι δημιουργώντας μια εφαρμογή γεμάτη ροκ με τρόπο που ο κώδικας σας είναι διατηρήσιμος, επαναχρησιμοποιήσιμος και ευέλικτος OOP η φύση των Δελφών θα σας βοηθήσει να οδηγήσετε το πρώτο 70% της διαδρομής σας. Ο καθορισμός των διεπαφών και η εφαρμογή τους θα βοηθήσουν με το υπόλοιπο 30%.
Abstract Classes
Μπορείτε να σκεφτείτε μια διεπαφή ως μια αφηρημένη κλάση με όλη την υλοποίηση απογυμνώνεται και όλα τα οποία δεν είναι δημόσια αφαιρεμένα. Μια αφηρημένη κατηγορία στην Δελφοί είναι μια κλάση που δεν μπορεί να παρουσιαστεί σε παράσταση - δεν μπορείτε να δημιουργήσετε ένα αντικείμενο από μια κλάση που έχει επισημανθεί ως αφηρημένη.
Ας ρίξουμε μια ματιά σε μια δήλωση διεπαφής παράδειγμα:
τύπος
IConfigChanged = διεπαφή['{0D57624C-CDDE-458B-A36C-436AE465B477}']
διαδικασία ApplyConfigChange;
τέλος;
ο IConfigChanged είναι μια διεπαφή. Μια διεπαφή ορίζεται πολύ σαν μια κλάση, χρησιμοποιείται η λέξη-κλειδί "interface" αντί "class". Η τιμή Guid που ακολουθεί τη λέξη-κλειδί διασύνδεσης χρησιμοποιείται από τον μεταγλωττιστή για να προσδιορίσει με μοναδικό τρόπο τη διασύνδεση. Για να δημιουργήσετε μια νέα τιμή GUID, απλά πατήστε Ctrl + Shift + G στο IDE Delphi. Κάθε διεπαφή που ορίζετε χρειάζεται μια μοναδική τιμή Guid.
Μια διεπαφή στο OOP ορίζει μια αφαίρεση - ένα πρότυπο για μια πραγματική κλάση που θα υλοποιήσει τη διασύνδεση - η οποία θα εφαρμόσει τις μεθόδους που ορίζονται από τη διασύνδεση. Μια διεπαφή δεν κάνει τίποτα, έχει μόνο μια υπογραφή για αλληλεπίδραση με άλλες (υλοποίηση) τάξεις ή διεπαφές.
Η εφαρμογή των μεθόδων (λειτουργίες, διαδικασίες και ιδιότητες Get / Set μεθόδους) γίνεται στην κλάση που υλοποιεί τη διεπαφή. Στον ορισμό της διεπαφής, δεν υπάρχουν τμήματα πλαισίου (ιδιωτικά, δημόσια, δημοσιευμένα κ.λπ.) τα πάντα είναι δημόσια. Ένας τύπος διεπαφής μπορεί να ορίσει λειτουργίες, διαδικασίες (που τελικά θα γίνουν μέθοδοι της κλάσης που υλοποιεί τη διεπαφή) και ιδιότητες. Όταν μια διεπαφή ορίζει μια ιδιότητα, πρέπει να ορίσει τις μεθόδους get / set - οι διεπαφές δεν μπορούν να ορίσουν μεταβλητές.
Όπως και με τις κλάσεις, μια διεπαφή μπορεί να κληρονομήσει από άλλες διεπαφές.
τύπος
IConfigChangedMore = διεπαφή(IConfigChanged)
διαδικασία ApplyMoreChanges;
τέλος;
Προγραμματισμός
Οι περισσότεροι προγραμματιστές των Δελφών όταν σκέφτονται τις διεπαφές που σκέφτονται για τον προγραμματισμό της COM. Ωστόσο, οι διεπαφές είναι απλώς ένα χαρακτηριστικό γνώρισμα της γλώσσας OOP - δεν συνδέονται ειδικά με το COM. Οι διασυνδέσεις μπορούν να οριστούν και να υλοποιηθούν σε μια εφαρμογή Delphi χωρίς να αγγίξουν το COM.
Εκτέλεση
Για να εφαρμόσετε μια διεπαφή πρέπει να προσθέσετε το όνομα της διασύνδεσης στην εντολή κλάσης, όπως στο:
τύπος
TMainForm = τάξη(TForm, IConfigChanged)
δημόσιο
διαδικασία ApplyConfigChange;
τέλος;
Στον παραπάνω κώδικα μια φόρμα Delphi που ονομάζεται "MainForm" υλοποιεί τη διασύνδεση IConfigChanged.
Προειδοποίηση: όταν μια κλάση εφαρμόζει μια διεπαφή, πρέπει να εφαρμόσει όλες τις μεθόδους και τις ιδιότητές της. Εάν αποτύχετε / ξεχάσετε να εφαρμόσετε μια μέθοδο (για παράδειγμα: ApplyConfigChange) ένα σφάλμα χρόνου μεταγλώττισης "E2003 Μη αναγνωρισμένο αναγνωριστικό: 'ApplyConfigChange'" θα συμβεί.
Προειδοποίηση: αν προσπαθήσετε να καθορίσετε τη διασύνδεση χωρίς την τιμή GUID, θα λάβετε: "E2086 Τύπος" IConfigChanged "δεν έχει οριστεί ακόμη πλήρως".
Παράδειγμα
Εξετάστε μια εφαρμογή MDI, όπου μπορούν να εμφανίζονται ταυτόχρονα διάφορες μορφές στο χρήστη. Όταν ο χρήστης αλλάξει τη διαμόρφωση της εφαρμογής, οι περισσότερες μορφές πρέπει να ενημερώσουν την προβολή / απόκρυψη ορισμένων κουμπιών, να ενημερώσουν τις λεζάντες ετικετών κ.λπ. Θα χρειαστείτε έναν απλό τρόπο για να ειδοποιήσετε όλες τις ανοικτές φόρμες ότι έχει συμβεί μια αλλαγή στη διαμόρφωση της εφαρμογής. Το ιδανικό εργαλείο για τη δουλειά ήταν μια διεπαφή.
Κάθε φόρμα που πρέπει να ενημερωθεί όταν οι αλλαγές διαμόρφωσης θα εφαρμόσουν το IConfigChanged. Δεδομένου ότι η οθόνη διαμόρφωσης εμφανίζεται με τρόπο, όταν κλείνει τον επόμενο κώδικα, διασφαλίζεται ότι όλες οι φόρμες εφαρμογής IConfigChanged ειδοποιούνται και ονομάζεται ApplyConfigChange:
διαδικασία DoConfigChange ();
var
cnt: ακέραιο;
icc: IConfigChanged;
ξεκινήσει
Για cnt: = 0 προς το -1 + οθόνη. FormCount κάνω
ξεκινήσει
αν Υποστηρίζει (Οθόνη. Έντυπα [cnt], IConfigChanged, icc) έπειτα
icc. ApplyConfigChange;
τέλος;
τέλος;
Τα Υποστηρίγματα λειτουργία (που ορίζεται στο Sysutils.pas) υποδεικνύει αν ένα δεδομένο αντικείμενο ή διεπαφή υποστηρίζει μια συγκεκριμένη διεπαφή. Ο κώδικας επαναλαμβάνεται μέσω της οθόνης. Συλλογή φορμών (του αντικειμένου TScreen) -όλες οι μορφές που εμφανίζονται στην εφαρμογή. Αν μια φόρμα Οθόνη. Έντυπα [cnt] υποστηρίζει τη διεπαφή, Υποστηρίζει επιστρέφει τη διεπαφή για την τελευταία παράμετρο παραμέτρου και επιστρέφει true.
Επομένως, εάν η φόρμα εφαρμόζει το IConfigChanged, η μεταβλητή icc μπορεί να χρησιμοποιηθεί για να καλέσει τις μεθόδους της διασύνδεσης, όπως εφαρμόζονται από τη φόρμα. Σημειώστε, φυσικά, ότι κάθε μορφή μπορεί να έχει τη δική του διαφορετική εφαρμογή της διαδικασίας ApplyConfigChange.
Προγόνων
Κάθε τάξη που καθορίζετε στους Δελφούς πρέπει να έχει έναν πρόγονο. Το TObject είναι ο απόλυτος πρόγονος όλων των αντικειμένων και των συστατικών. Η παραπάνω ιδέα ισχύει και για τις διεπαφές, η IInterface είναι η βασική κλάση για όλες τις διεπαφές. Η ενδοεπιφάνεια ορίζει 3 μεθόδους: QueryInterface, _AddRef και _Release.
Αυτό σημαίνει ότι το IConfigChanged έχει επίσης αυτές τις 3 μεθόδους, αλλά δεν τις εφαρμόσαμε. Αυτό οφείλεται στο γεγονός ότι το TForm κληρονομεί από το TComponent που ήδη υλοποιεί το IInterface για εσάς! Όταν θέλετε να εφαρμόσετε μια διασύνδεση σε μια τάξη που κληρονομεί από το TObject, βεβαιωθείτε ότι η κλάση σας κληρονόμησε από το TInterfacedObject. Δεδομένου ότι το TInterfacedObject είναι ένα TObject που υλοποιεί την IInterface. Για παράδειγμα:
TMyClass = τάξη(TInterfacedObject, IConfigChanged)
διαδικασία ApplyConfigChange;
τέλος;
Εν κατακλείδι, IUnknown = IInterface. Το IUnknown είναι για το COM.