ΑΤΕΙΘ - ΣΤΕΦ Τμήμα Πληροφορικής

Σχετικά έγγραφα
ΕΠΛ233 ΔΙΑΠΡΟΣΩΠΕΙΕΣ

ΑΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Βασικά της γλώσσας JAVA

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Αντικειµενοστρεφής Προγραµµατισµός

Wrapper Classes, Abstract Classes and Interfaces

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Αντικειµενοστραφής Προγραµµατισµός

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Οντοκεντρικός Προγραμματισμός

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

(Διαφάνειες Νίκου Βιδάκη)

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΘΕΜΑΤΑ ΕΞΕΤΑΣΕΩΝ ΟΜΑΔΑ Α

2.1 Αντικειµενοστρεφής προγραµµατισµός

8. Μέθοδοι (Methods)

Κλάσεις και Αντικείµενα

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

Διδάσκων: Παναγιώτης Ανδρέου

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Μάθημα 1 [3/11/2015].

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 8 : ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ & ΠΟΛΥΜΟΡΦΙΣΜΟΣ

Διδάσκων: Παναγιώτης Ανδρέου

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

API: Applications Programming Interface

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

02 Αντικειμενοστρεφής Προγραμματισμός

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΕΠΛ233 ΠΟΛΥΜΟΡΦΙΣΜΟΣ

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Κλάσεις. Τροποποιητές, Πακέτα, ιασυνδέσεις. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Διδάσκων: Παναγιώτης Ανδρέου

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Οντοκεντρικός Προγραμματισμός

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

Υπερφόρτωση (Overloading) Υπέρβαση (Overriding) - Upcasting Downcasting Final classes, methods

Κληρονομικότητα. Κληρονομικότητα (inheritance) είναι ο τρόπος µε τον οποίο μία τάξη μπορεί να κληρονομήσει ιδιότητες και συμπεριφορά από άλλες τάξεις.

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αντικειμενοστρεφής Προγραμματισμός

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Αντικειμενοστρεφής Προγραμματισμός

ΔΙΑΠΡΟΣΩΠΕΙΕΣ. Αφαιρετικές Μέθοδοι. Αφαιρετικές Μέθοδοι. Αφαιρετικές Κλάσεις

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

Αντικειμενοστρεφής Προγραμματισμός

Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής - Εβδομάδα 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Παράδειγμα χρήσης κληρονομικότητας

Transcript:

Αντικειμενοστρεφής Προγραμματισμός Παναγιώτης Αδαμίδης adamidis@it.teithe.gr Διασυνδέσεις/Διεπαφές (Interfaces) Γενικά περί διασυνδέσεων (1/2) An interface is a named collection of method declarations (without definitions). An interface can also declare constants. The Java Tutorial, Sun Microsystems Σκοπός: Καθορισμός ενός συνόλου κανόνων συμπεριφοράς που μπορεί να παρέχει κάποια κλάση. Οι διασυνδέσεις παρέχουν ένα πιο επιτηδευμένο τρόπο οργάνωσης και ελέγχου των αντικειμένων παρέχοντας έναν τρόπο για να καθορίσουμε τι θα κάνει μία κλάση αλλά όχι πως θα το κάνει. Η χρήση διασυνδέσεων μας επιτρέπει να ορίσουμε την μορφή μίας κλάσης (ονόματα μεθόδων, παράμετροι, τύπος επιστροφής) αλλά όχι την υλοποίηση. Γενικά περί διασυνδέσεων (2/2) Μπορούμε να θεωρήσουμε μία διασύνδεση ως μία αμιγώς αφηρημένη (abstract) κλάση, με παρόμοια σύνταξη. Αν και μοιάζει με μία abstract κλάση, έχει σημαντικές διαφορές: Οι διασυνδέσεις διαθέτουν μόνο δηλώσεις μεθόδων και όχι υλοποίησή τους. Μία κλάση μπορεί να υλοποιήσει πολλές διασυνδέσεις, αλλά μπορεί να κληρονομήσει μόνο μία κλάση. Οι διασυνδέσεις δεν αποτελούν μέρος μιας ιεραρχίας κλάσεων, έτσι κλάσεις που δεν έχουν κάποια σχέση μεταξύ τους μπορούν να υλοποιούν την ίδια διασύνδεση. Οποιαδήποτε κλάση υλοποιεί (implements) μία διασύνδεση έχει συμβατική υποχρέωση να παρέχει υλοποιήσεις όλων των μεθόδων της διασύνδεσης αλλιώς πρέπει να δηλωθεί ως abstract. Εισάγει την δυνατότητα χρήσης πολλαπλής κληρονομικότητας και ενός κομψού τρόπου δήλωσης σταθερών. Μορφή Δήλωσης [public] interface <όνομα> <τύπος> <όνομα_μεθόδου>([<λίστα_παραμέτρων>]); : : : <τύπος> <όνομα_μεταβλητής> = <τιμή>; : : : Εάν η διασύνδεση είναι public θα πρέπει να βρίσκεται σε αρχείο με το ίδιο όνομα και μπορεί να υλοποιηθεί σε οποιοδήποτε πακέτο Οι μεταβλητές πρέπει να αρχικοποιούνται και είναι (έμμεσα) static και final. Όλα τα μέλη είναι (έμμεσα) public. Η υλοποίηση γίνεται σε κάποια κλάση. Μπορούν να υπάρξουν διαφορετικές υλοποιήσεις της ίδιας διασύνδεσης. Μία κλάση μπορεί να υλοποιήσει πολλές διασυνδέσεις. Μορφή Δήλωσης-Παράδειγμα Υλοποίηση Καθορισμός διασύνδεσης σε μία κλάση που παράγει μία σειρά αριθμών. Δηλώνεται public για να μπορεί να υλοποιηθεί από κλάσεις σε οποιοδήποτε πακέτο. public interface Series int getnext(); // επιστροφή επόμενου αριθμού void reset(); // επανεκκίνηση void setstart (int x); // ορισμός τιμής έναρξης [public] class <όνομα> [extends <υπερκλάση>] implements <διασύνδεση> [, <διασύνδεση> [, ]] // σώμα κλάσης Οι μέθοδοι που υλοποιούν τις μεθόδους μίας διασύνδεσης πρέπει να δηλώνονται ως public. Εάν παραλείψουμε την υλοποίηση κάποιας μεθόδου τότε η κλάση πρέπει να δηλωθεί ως abstract. Παναγιώτης Αδαμίδης 1

Υλοποίηση - Παράδειγμα_1 (1) class ByTwos implements Series int start; int val; ByTwos() start=0; val=0; public int getnext() val+=2; return val; public void reset() start=0; val=0; public void setstart(int x) start=x; val=x; Υλοποίηση - Παράδειγμα_1 (2) class SeriesDemo public static void main (String args[]) ByTwos ob = new ByTwos(); for (int i=0; i<5; i++) System.out.println("Next value is "+ob.getnext()); System.out.println("\nResetting"); ob.reset(); for (int i=0; i<5; i++) System.out.println("Next value is "+ob.getnext()); System.out.println("\nStarting at 100"); ob.setstart(100); for (int i=0; i<5; i++) System.out.println("Next value is "+ob.getnext()); Άλλη χρήση!!! Ένας κομψός τρόπος παροχής σταθερών Δήλωση σταθερών με τις μέχρι τώρα γνώσεις μας class Constants public final static int FEETPERMILE = 5280; public final static String PROMPT = "Enter a number"; public final static double PI = 3.141592; Χρήση: feet = miles * Constants.FEETPERMILE; Καλύτερος τρόπος δήλωσης σταθερών interface Constants int FPA_PERCENT = 19; String PROMPT = "Enter a price"; double PI = 3.141592; Υλοποίηση της διασύνδεσης : public class Box implements Constants // lots of code omitted cyclearea = radius * PI; Άλλη χρήση!!! Ομαδοποίηση διαφορετικού τύπου αντικειμένων σε μία δομή Παναγιώτης Αδαμίδης 2

Παράδειγμα μουσικών οργάνων (1) Παράδειγμα μουσικών οργάνων (2) interface Instrument void play(); String what(); void adjust(); implements implements implements Wind Percussion Stringed void play() void play() void play() String what() String what() String what() void adjust() void adjust() void adjust() extends extends Woodwind Brass void play() void play() String what() void adjust() interface Instrument // Compile-time constant: int i = 5; // static & final // Cannot have method definitions: void play(); // Automatically public String what(); void adjust(); class Wind implements Instrument System.out.println("Wind.play()"); public String what() return "Wind"; public void adjust() Παράδειγμα μουσικών οργάνων (3) Παράδειγμα μουσικών οργάνων (4) class Percussion implements Instrument System.out.println("Percussion.play()"); public String what() return "Percussion"; public void adjust() class Stringed implements Instrument System.out.println("Stringed.play()"); public String what() return "Stringed"; public void adjust() class Brass extends Wind System.out.println("Brass.play()"); public void adjust() System.out.println("Brass.adjust()"); class Woodwind extends Wind System.out.println("Woodwind.play()"); public String what() return "Woodwind"; Παράδειγμα μουσικών οργάνων (5) public class Music5 static void tune(instrument i) i.play(); static void tuneall(instrument[] e) for(int i = 0; i < e.length; i++) tune(e[i]); public static void main(string[] args) Instrument[] orchestra = new Instrument[5]; int i = 0; // Upcasting during addition to the array: orchestra[i++] = new Wind(); orchestra[i++] = new Percussion(); orchestra[i++] = new Stringed(); orchestra[i++] = new Brass(); orchestra[i++] = new Woodwind(); tuneall(orchestra); Άλλη χρήση!!! Πολλαπλή κληρονομικότητα Παναγιώτης Αδαμίδης 3

Περί πολλαπλής κληρονομικότητας Horse Pegasus Bird Δύο βασικές κλάσεις (υπερκλάσεις), μία παραγόμενη (υποκλάση) Πολλαπλή κληρονομικότητα είναι η δυνατότητα δημιουργίας νέας κλάσης συνδυάζοντας τις ιδιότητες πολλών κλάσεων. Στην Java μπορούμε να κληρονομήσουμε μόνο μία κλάση. Μη ύπαρξη πολλαπλής κληρονομικότητας Η διασύνδεση μας προσφέρει έμμεσα την λειτουργικότητα της πολλαπλής κληρονομικότητας Η πολλαπλή κληρονομικότητα μπορεί να υλοποιηθεί κληρονομώντας μία μόνο κλάση και υλοποιώντας ένα πλήθος διασυνδέσεων. Η πολλαπλή κληρονομικότητα οδηγεί σε πιθανή σύγχυση ονομάτων (πχ. Bird.doYourThing() - Horse.doYourThing()) Η υλοποίηση μιας διασύνδεσης έχει την ίδια συμπεριφορά με την κληρονομικότητα μιας υπερκλάσης, αλλά πρέπει να υλοποιήσει όλες τις μεθόδους δεν υπάρχουν προβλήματα σύγχυσης ονομάτων Επειδή με την διασύνδεση δεν γίνεται δέσμευση μνήμης υπάρχει η δυνατότητα συνδυασμού πολλών διασυνδέσεων σε μία κλάση, χωρίς τα προβλήματα της πολλαπλής κληρονομικότητας. Κατά γενική ομολογία, τα καλά της πολλαπλής κληρονομικότητας δεν αξίζουν τα προβλήματα που προκαλεί Παράδειγμα (1) interface CanFight void fight(); interface CanSwim void swim(); interface CanFly void fly(); class ActionCharacter public void fight() System.out.println("ActionCharacter.fight()"); class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly public void swim() System.out.println("Hero.swim()"); public void fly() System.out.println("Hero.fly()"); Παράδειγμα (2) public class Adventure static void s(hero x) x.fight(); static void t(canfight x) x.fight(); static void u(canswim x) x.swim(); static void v(canfly x) x.fly(); static void w(actioncharacter x) x.fight(); public static void main(string[] args) Hero h = new Hero(); s(h); t(h); // Treat it as a CanFight u(h); // Treat it as a CanSwim v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter Παράδειγμα (3) Έξοδος: ActionCharacter.fight() ActionCharacter.fight() Hero.swim() Hero.fly() ActionCharacter.fight() Κληρονομικότητα διασύνδεσης Παράδειγμα (1) interface Monster void menace(); interface DangerousMonster extends Monster void destroy(); interface Lethal void kill(); class DragonZilla implements DangerousMonster public void menace() System.out.println("DragonZilla.menace()"); public void destroy() System.out.println("DragonZilla.destroy()"); Παναγιώτης Αδαμίδης 4

Κληρονομικότητα διασύνδεσης Παράδειγμα (2) interface Vampire extends DangerousMonster, Lethal void drinkblood(); class HorrorShow static void u(monster b) b.menace(); static void v(dangerousmonster d) d.menace(); d.destroy(); public static void main(string[] args) DragonZilla if2 = new DragonZilla(); u(if2); v(if2); Κληρονομικότητα διασύνδεσης Παράδειγμα (3) Έξοδος: DragonZilla.menace() DragonZilla.menace() DragonZilla.destroy() API Interfaces Comparable Cloneable Interface Comparable Θέλουμε μία περιέχουσα δομή (container) η οποία μπορεί να μπορεί να έχει ταξινομημένα τα αντικείμενα που περιλαμβάνει. Για να μπουν δύο αντικείμενα σε κάποια σειρά θα πρέπει να υπάρχει μέθοδος σύγκρισής τους. Ποια μέθοδο θα χρησιμοποιήσουμε για να συγκρίνουμε δύο αντικείμενα; Θα παρέχουμε εμείς μία τέτοια μέθοδο; Όλα τα αντικείμενα που θα υπάρχουν σε αυτή την ταξινομημένη περιέχουσα δομή θα πρέπει υποχρεωτικά να παρέχουν μία τέτοια μέθοδο σύγκρισης. Επίσης αυτή η μέθοδος θα πρέπει να έχει μία γνωστή υπογραφή. Πως το επιτυγχάνουμε; Με χρήση της διασύνδεσης Comparable Interface java.lang.comparable Παράδειγμα... Comparable είναι μία προκαθορισμένη διασύνδεση του API της Java. Από το API: This interface imposes a total ordering on the objects of each class that implements it. Θέλουμε να αποθηκεύσουμε αντικείμενα Box τα οποία συγκρίνονται με βάση τον όγκο τους. public interface Comparable public int compareto(object o) Επιστρέφει: Ένα αρνητικό ακέραιο, μηδέν ή θετικό ακέραιο εάν το καλών αντικείμενο είναι μικρότερο από, ίσο με, ή μεγαλύτερο από το αντικείμενο που δίνεται ως παράμετρος. Παναγιώτης Αδαμίδης 5

Καθορισμός της κλάσης Box Προσθήκη επιπλέον δυνατοτήτων public class Box int length; int width; int height; public void setlength (int newlen) length = newlen; // of setlength public int getlength ( ) return (length); // of getlength public void setwidth (int newwid) width = newwid; // of setwidth public int getwidth ( ) return (width); // of getwidth public void setheight (int newht) height = newht; // of setheight public int getheight ( ) return (height); // of getheight public int getvolume ( ) return ( getlength( ) * getwidth( ) * getheight( ) ); // of getvolume // of class Box public class Box implements Comparable // Όλα τα άλλα όπως προηγουμένως public int compareto(object o) int retval = -1; if(o instanceof Box) retval = getvolume() - ((Box)o).getVolume(); if(retval == 0) retval = 0; else if(retval > 0) retval = 1; else retval = -1; // if return retval; Εκτέλεση κώδικα... Εν κατακλείδι! Box a = new Box(10, 20, 30); Box b = new Box(2, 4, 6); Box c = new Box(20, 10, 30); System.out.println(a.compareTo(b)); ===> 1 System.out.println(a.compareTo(c)); ===> 0 System.out.println(b.compareTo(c)); ===> -1 System.out.println(a.compareTo("Hello")); ===> -1; Αν πούμε ότι κάποιο αντικείμενο πρέπει να είναι συγκρίσιμο ( Comparable ) είναι σαν να λέμε: Πρέπει να είναι αντικείμενο (δηλ. να έχει μία σχέση «είναι-ένα» με τη κλάση java.lang.object. It pretty much will satisfy that by default.), ΚΑΙ Πρέπει να έχει υλοποιημένη μία μέθοδο compareto. (Απλά συμπεριλάβετε μία μέθοδο η οποία έχει την ίδια υπογραφή με αυτή που βρίσκεται στο interface java.lang.comparable) Υλοποιώντας την διασύνδεση Comparable σε μία κλάση είναι σαν να την υποχρεώνουμε να παρέχει την μέθοδοcompareto. Παναγιώτης Αδαμίδης 6