====== Δήλωση του Interface ====== Παρακάτω δίνεται το παράδειγμα ορισμού ενός Interface ως εξής: public interface MyInterface extends Interface1, Interface2, Interface3 { // constant declarations // base of natural logarithms double E = 2.718282; double PI = 3.14159; // method signatures public void interfaceMethod(int i, double x); public int interfaceMethod2(String s); } * **public ή κανένας προσδιοριστής πρόσβασης:** Αν οριστεί //public// τότε το interface είναι ορατό από όλες τις κλάσεις και όλα τα πακέτα στην Java. Αν δεν οριστεί κάτι (package private) τότε το interface είναι ορατό μόνο μέσα στο πακέτο στο οποίο δηλώνεται. * **interface:** δεσμευμένη λέξη * **το όνομα του interface:** στο παράδειγμα μας ''MyInterface''. * **extends:** ένα ή περισσότερα interfaces τα οποία επεκτείνει το συγκεκριμένο interface (comma seperated). Τόσο στις κλάσεις όσο και στα interfaces ορίζεται η ιδιότητα της κληρονομικότητας. __Η διαφορά είναι ότι ενώ στην κλάση μπορούμε να έχουμε μόνο μία γονική κλάση, στα interfaces μπορούμε να έχουμε περισσότερα του ενός γονικά interfaces__. Ακριβώς όπως και οι κλάσεις κάθε interface πρέπει να βρίσκεται σε ξεχωριστό αρχείο, όπου το όνομα του αρχείου ταυτίζεται με το όνομα του interface και έχει κατάληξη **.java**. Για παράδειγμα το interface με όνομα **MyInterface** θα βρίσκεται σε ένα αρχείο με όνομα **MyInterface.java**. ===== Το σώμα του Interface ===== Ένα //interface// μπορεί να περιέχει πεδία όπως στο παραπάνω παράδειγμα. double E = 2.718282; double PI = 3.14159; Τα πεδία αυτά εξ ορισμού (by default) ''public, static, final'', δηλ είναι **__σταθερές__** που ανήκουν στις κλάσεις που θα υλοποιήσουν το interface στο οποίο δηλώνονται. Οι μέθοδοι σε ένα interface κατά κανόνα είναι **abstract**, δηλαδή περιέχεται μόνο η δήλωση της μεθόδου χωρίς σώμα (δηλ. υλοποίηση). Επίσης, όλες οι μέθοδοι σε ένα interface είναι εξ ορισμού //public//, κατά συνέπεια ο προσδιορισστής //public// μπορεί να παραληφθεί δηλ public interface MyInterface extends Interface1, Interface2, Interface3 { // constant declarations // base of natural logarithms double E = 2.718282; double PI = 3.14159; // method signatures public void interfaceMethod1(int i, double x); public int interfaceMethod2(String s); } ===== Παράδειγμα interface - H Στοίβα (Stack) ===== Ας υποθέσουμε ότι θέλουμε να δηλώσουμε μέσω ενός interface της μεθόδους που πρέπει να υποστηρίζει μία στοίβα. Η στοίβα είναι μία δομή αποθήκευσης δεδομένων τύπου **Last In First Out (LIFO)**, όπου το αντικείμενο αποθηκεύεται στη στοίβα τελευταίο εξάγεται από αυτή πρώτο. Στο παρακάτω σχήμα δίνεται η γραφική απεικόνιση μιας στοίβας που αποθηκεύει ακέραιους αριθμούς. Αρχικά είναι αποθηκευμένο το 1 και στη συνέχεια αποθηκεύεονται τα 2,3,4,5,6. Παρατηρήστε ότι η σειρά με την οποία αφαιρούνται οι αριθμοί είναι η αντίστροφη δηλ 6,5,4,3,2,1. {{ :java:lifo_stack.png? |Γραφική απεικόνιση μιας στοίβας που αποθηκεύει ακέραιους αριθμούς}} Κάθε στοίβα θα πρέπει να υποστηρίζει κατ' ελάχιστο τα εξής: * μέθοδο επιστροφής του μεγέθους της στοίβας. * μέθοδο ένθεσης στην κορυφή της στοίβας. * μέθοδο απόσβεσης του κορυφαίου στοιχείου. * μέθοδο επιστροφής του κορυφαίου στοιχείου της στοίβας χωρίς διαγραφή από τη στοίβα. Παρακάτω δηλώνεται το //interface Stack// που υποστηρίζει αυτές τις λειτουργίες public interface Stack { public int size(); // επιστροφή του μεγέθους της στοίβας. public void push(Object o); // ένθεση στην κορυφή της στοίβας. public Object pop(); // απόσβεση από την κορυφή της στοίβας. public Object top(); // επιστροφή του κορυφαίου στοιχείου της στοίβας χωρίς διαγραφή του. } | Προηγούμενο : [[ :java:interface | Διεπαφή (interface) ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:interface_implementation | Υλοποίηση του interface ]] |