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

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

Πακέτα (Packages) Φωλιασμένες ή Εσωτερικές Κλάσεις (Inner Classes) Παναγιώτης Σφέτσος, PhD

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

ΚΛΑΣΕΙΣ ΜΕΘΟΔΟΙ - ΑΝΤΙΚΕΙΜΕΝΑ

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

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

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

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

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

Εκτέλεση εξωτερικών προγραμμάτων και εντολών The Java Reflection - Αρχικοποίηση (Initialization)

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

Wrapper Classes, Abstract Classes and Interfaces

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στον Προγ/μό Η/Υ

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

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

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

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

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

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

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

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

Εξαιρέσεις (Exceptions) Λάθη (Errors) Χειρισμός των Εξαιρέσεων (Exception Handling) Assertions

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

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

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

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

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

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

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

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

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

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

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

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

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιεπαφές και Εσωτερικές κλάσεις Interfaces and Inner Classes. ιεπαφές - Interfaces

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

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

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

Από τη UML στον Κώδικα. Μέρος Β

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

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

Wrapper Classes Τοποθέτηση Δεδομένων Κλήση Μεθόδων. Παναγιώτης Σφέτσος, PhD

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

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

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Ανάλυση άσκησης. Employee. SalariedEmployee CommissionEmployee HourlyEmployee. BasePlusCommissionEmployee

Generics και ArrayLists

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

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

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

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

ΑΣΚΗΣΕΙΣ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ (inheritance)

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

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

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

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

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

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

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

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

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

Διαγράμματα Κλάσεων στη Σχεδίαση

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

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

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Προγραμματισμός Διαδικτύου

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

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

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 9: Κληρονομικότητα (Inheritance)

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

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

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

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

Transcript:

(Object Oriented Programming) Διασυνδέσεις / Διεπαφές PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr

Περιεχόμενα Μαθήματος Διεπαφές/Διασυνδέσεις (Interfaces) 2

Διεπαφές/Διασυνδέσεις (Interfaces) (1/13) Η Διεπαφή περιέχει ένα σύνολο από αφηρημένες μεθόδους που ορίζουν μία συμπεριφορά, την οποία συμπεριφορά αποκτούν όσες κλάσεις υλοποιήσουν τη συγκεκριμένη Διεπαφή (υλοποιώντας αυτές τις αφηρημένες μεθόδους). Η διεπαφή είναι μια έννοια ειδικής κλάσης, παρόμοιας με την αφηρημένη κλάση, που μπορεί να περιέχει μόνο static σταθερές και αφηρημένες μεθόδους (μόνο τις υπογραφές των μεθόδων, χωρίς υλοποίηση/σώμα). Οι διεπαφές μεταγλωττίζονται σε ξεχωριστά bytecode αρχεία (.class) όπως και οι κανονικές κλάσεις. Όπως και στις αφηρημένες κλάσεις δεν μπορούμε να ορίσουμε αντικείμενα της διεπαφής με τον τελεστή new. Μια κλάση μπορεί να υλοποιεί πολλές διεπαφές. 3

Διεπαφές/Διασυνδέσεις (Interfaces) (2/13) Δεν περιέχει πεδία, δομητές και στατικές μεθόδους. Το σύνολο των μεθόδων πρέπει να υλοποιηθεί από άλλη κλάση/σεις. Όλες οι μεταβλητές πρέπει να είναι public, static και final (άμεσα ή έμμεσα).οι μέθοδοι public. Μια διεπαφή ορίζεται χρησιμοποιώντας την λέξη κλειδί - interface αντί της δεσμευμένης λέξης class. Σύνταξη: public interface <interface name> { Δηλώσεις Σταθερών <constant declarations>; Υπογραφές Μεθόδων <method signatures>; } 4

Διεπαφές/Διασυνδέσεις (Interfaces) (3/13) Μια κλάση που υλοποιεί τη διεπαφή έχει στην επικεφαλίδα της τη δεσμευμένη λέξη implements και περιλαμβάνει τις μεθόδους με τον κώδικα που υλοποιεί την λειτουργικότητά τους. Η διεπαφή προδιαγράφει τις μεθόδους με την υπογραφή τους (όνομα μεθόδου, τύπος παραμέτρων). class <ClassName> implements <InterfaceName> {...} // συνδυασμός κληρονομικότητας και υλοποίηση Διεπαφής class <ClassName> extends <SuperClass> implements <InterfaceN-1, <InterfaceN-2, {...} // σαν πολλαπλή κληρονομικότητα Οι διεπαφές μπορούν να επεκτείνουν (extends) άλλες διεπαφές. 5

Διεπαφές/Διασυνδέσεις (Interfaces) (4/13) Μια κλάση μπορεί να επεκτείνει (extends) μόνον μία υπερκλάση (απλή κληρονομικότητα), όμως μπορεί να υλοποιεί (implements) περισσότερες από μία διεπαφές (έμμεσα πολλαπλή κληρονομικότητα). Μια διεπαφή μπορεί να κληρονομήσει (extends) μια άλλη διεπαφή. Οι ιδιότητες του πολυμορφισμού ισχύουν και μεταξύ των διεπαφών και των κλάσεων που τα υλοποιούν και των υποκλάσεων τους, διότι και εδώ η υλοποίηση της μεθόδου μιας διεπαφής εξαρτάται από τον τύπο του αντικειμένου που την καλεί. Αν μια κλάση δεν ορίσει όλες τις μεθόδους ενός interface που υλοποιεί τότε πρέπει να δηλωθεί σαν abstract. 6

Διεπαφές/Διασυνδέσεις (Interfaces) (5/13) Γιατί χρησιμοποιούμε τις διεπαφές; Για να χρησιμοποιούμε την λειτουργικότητα των αντικειμένων και όχι την υλοποίησή τους (που δεν την γνωρίζουμε). Για να εκτελούνται παρόμοιες μέθοδοι από μη συσχετιζόμενες κλάσεις. Για να πετύχουμε πολλαπλή κληρονομικότητα. 7

Διεπαφές/Διασυνδέσεις (Interfaces) (6/13) Η διεπαφή μπορεί να ορίσει σταθερές (που είναι άμεσα ή έμμεσα public, static και final), που χρησιμοποιούνται απ ευθείας με το όνομά τους στις κλάσεις που υλοποιούν την διεπαφή. Παράδειγμα: interface OrismosConstants { double pi=3.14; int syntelestis_fpa=25; } class TestConstants implements OrismosConstants { public static final int CONST = 18; public static void main(string args[]) { System.out.println("Stathera pi tis diepafis= "+pi); System.out.println("Stathera syntelestis_fpa tis diepafis= "+syntelestis_fpa); System.out.println("Stathera tis klasis= "+CONST);}} 8

Διεπαφές/Διασυνδέσεις (Interfaces) (7/13) Υλοποίηση μεθόδων της διεπαφής (κλασική χρήση), σε κλάση που υλοποιεί την διεπαφή. Παράδειγμα: interface MyDemoInterface { public void method1(); public void method2();} class Aclass implements MyDemoInterface { public void method1() { System.out.println("Ylopoiisi tis method1() stin Aclass"); } public void method2() { System.out.println("Ylopoiisi tis method2() stin Aclass"); } public static void main(string arg[]){ MyDemoInterface obj = new Aclass(); obj. method1(); obj. method2(); } } 9

Διεπαφές/Διασυνδέσεις (Interfaces) (8/13) Κληρονομικότητα διεπαφής: Όπως είπαμε, η διεπαφή μπορεί να κληρονομεί (extends) άλλη διεπαφή όπως μια κλάση κληρονομεί μια άλλη κλάση. Η child-διεπαφή κληρονομεί τις σταθερές και μεθόδους της parent-διεπαφής. Προσοχή στην υλοποίηση των μεθόδων από την κληρονομικότητα των διεπαφών Στο παρακάτω παράδειγμα, ορίζονται και οι δύο μέθοδοι στην κλάση Demo που υλοποιεί μόνο την διεπαφή Diepafi2, γιατί αυτή κληρονομεί από την Diepafi1. Παράδειγμα: interface Diepafi1{ public void method1();} interface Diepafi2 extends Diepafi1 { public void method2();} 10

Διεπαφές/Διασυνδέσεις (Interfaces) (9/13) class Demo implements Diepafi2{ public void method1(){ System.out.println("Ylopoiisi tis method1() tis Diepafi1");} public void method2(){ System.out.println("Ylopoiisi tis method2() tis Diepafi2");}} class TestInterface2 { public static void main(string args[]) { Demo obj = new Demo(); obj. method1(); obj. method2(); }} 11

Διεπαφές/Διασυνδέσεις (Interfaces) (10/13) Η διεπαφή Shape ορίζει την μέθοδο draw() που θα υλοποιηθεί στις δύο κλάσεις Circle και Rectangle που υλοποιούν την διεπαφή. Δες την κλάση ShapeConstruction που υλοποιεί το πρότυπο (pattern) Factory. interface Shape {public void draw();} class Circle implements Shape { public void draw() {System.out.println("H Draw() gia ton Kyklo");}} class Rectangle implements Shape { public void draw() {System.out.println("H Draw() gia to Parallilogrammo");}} class ShapeConstruction { public Shape getshape(string s){ if (s.equals("circle")){return new Circle();} if (s.equals("rectangle")){return new Rectangle();} return null; }} 12

Διεπαφές/Διασυνδέσεις (Interfaces) (11/13) class TestInterfaces { public static void main(string args[]) { ShapeConstruction sc=new ShapeConstruction(); Shape sh1=sc.getshape("circle"); sh1.draw(); Shape sh2=sc.getshape("rectangle"); sh2.draw(); } } 13

Διεπαφές/Διασυνδέσεις (Interfaces) (12/13) Η διεπαφή Emvadon ορίζει την μέθοδο computeemvadon() που θα υλοποιηθεί Στις κλάσεις Rectangle και Triangle, υλοποιώντας την διεπαφή. Προσέξτε τις εντολές: Emvadon emv; και emv = rect; interface Emvadon { float computeemvadon(float x, float y);} class Rectangle implements Emvadon { public float computeemvadon(float x, float y){ return(x * y);}} class Triangle implements Emvadon { public float computeemvadon(float x, float y) { return(x * y/2);}} 14

Διεπαφές/Διασυνδέσεις (Interfaces) (13/13) class InterfaceEmvadon { public static void main(string args[]){ Rectangle rect = new Rectangle(); Triangle tri = new Triangle(); Emvadon emv; //μπορούμε αναφορά, όχι δημιουργία αντικειμένου με τον τελεστή new emv = rect; System.out.println("To Emvadon tou Rectangle(2,4)= "+ emv.computeemvadon(2,4)); emv = tri; System.out.println("To Emvadon tou Triangle(6, 8)= "+ emv.computeemvadon(6,8));}} 15

Ξαναγράφοντας Διεπαφές (Πρόβλημα επεκτασιμότητας της διεπαφής ) Σκεφτείτε την περίπτωση όπου έχετε αναπτύξει μια διεπαφή π.χ. public interface Transactions { void debit(string n, double b, double p); void credit(string n, double b, double p);} Υποθέστε ότι θέλετε να χρησιμοποιήσετε και άλλο είδος δοσοληψίας π.χ. void metafora(string n, double b, double p); Αν την προσθέσουμε στην ήδη υπάρχουσα διεπαφή, τότε οι κλάσεις που υλοποιούν την διεπαφή θα παρουσιάσουν πρόβλημα (λάθος), γιατί δεν υλοποιούν όλες τις μεθόδους. Λύση του προβλήματος Δημιουργία νέας διεπαφής που θα κληρονομεί (extends) από την transactions και θα ορίζει την νέα λειτουργικότητα, π.χ.: public interface MetaforaPosou extends Trasanctions { void metafora(string n, double b, double p); } 16

Άσκηση 1 (Πολλαπλή κληρονομικότητα) Να γραφεί πρόγραμμα που χειρίζεται τις δοσοληψίες ενός λογαριασμού. Το πρόγραμμα ορίζει την κλάση Account με πεδία (1) eponymia, String και (2) balance, double και επιπλέον πλήρη δομητή, getters() και την tostring(). Για την εκτέλεση των δοσοληψιών το πρόγραμμα ορίζει τις διεπαφές: (1) idebit : με την μέθοδο void debit(string name, double balance, double poso); (2) icredit : με την μέθοδο void credit(string name, double balance, double poso); (1) imetafora : με την μέθοδο void metafora(string name, double balance, double poso); και τις κλάσεις: (1) Debit, που κληρονομεί (extends) την Account και υλοποιεί (implements) την idebit. Η κλάση περιέχει το πεδίο poso, double, πλήρη δομητή, και υλοποιεί την μέθοδο debit(). (2) Credit, που κληρονομεί (extends) την Account και υλοποιεί (implements) την icredit. Η κλάση περιέχει το πεδίο poso, double, πλήρη δομητή, και υλοποιεί την μέθοδο credit(). (3) Metafora, που κληρονομεί (extends) την Account και υλοποιεί (implements) την imetafora. Η κλάση περιέχει πλήρη δομητή, και υλοποιεί την μέθοδο metafora(), που εμφανίζει εκτός από το ποσό μεταφοράς και το νέο υπόλοιπο (balance). Στην κλάση AccountTest (με την main), θα ορίσετε ένα πίνακα Ν αντικειμένων Account, τύπου Debit, Credit και Metafora, και θα εκτελέσετε τις δοσοληψίες. Χρησιμοποιήστε την instanceof (π.χ. If (pinakas[i] instanceof Debit) {.}). 17

Σύγκριση χαρακτηριστικών απλών κλάσεων, Αφηρημένων κλάσεων και Διεπαφών Χαρακτηριστικό Απλή κλάση Αφηρημένη κλάση Διεπαφή Μπορούν να δημιουργηθούν αντικείμενα; Ναι Όχι Όχι Μπορούν να οριστούν πεδία και συγκεκριμένες μέθοδοι; Ναι Ναι Όχι Μπορούν να οριστούν σταθερές; Ναι Ναι Ναι Μια κλάση μπορεί να επεκτείνει (extends): 0 ή 1 0 ή 1 0 Μια κλάση μπορεί να υλοποιήσει (implements): 0 0 1..* Μπορούν να οριστούν αφηρημένες μέθοδοι; Όχι Ναι Ναι Μπορούν να δηλωθούν μεταβλητές αυτών των τύπων; Ναι Ναι Ναι 18

Προκαθορισμένες Διεπαφές του API της Java Comparable (Interface java.lang.comperable) Για την σύγκριση αντικειμένων Η διεπαφή περιέχει μια μέθοδο την compareto() που συγκρίνει το αντικείμενο που καλεί την μέθοδο με το αντικείμενο που περνάει σαν παράμετρος στην μέθοδο. Η μέθοδος επιστρέφει ένα αρνητικό ακέραιο αριθμό, ή το 0, ή ένα θετικό ακέραιο αριθμό ανάλογα αν το καλών αντικείμενο είναι μικρότερο, ίσο ή μεγαλύτερο από το αντικείμενο παράμετρο της μεθόδου. public interface Comparable { } public int compareto(object o); Χρησιμοποιείται για να συγκρίνουμε αντικείμενα μιας συγκεκριμένης δομής με τελικό σκοπό την ταξινόμηση των αντικειμένων. 19

Comparable CompareTo()(1/4) Χρήση της CompareTo() για έλεγχο σύγκριση Stings Στη σύγκριση str1 με str2 επιστρέφει 0 (ίσα) class Test1 { public static void main(string args[]) { String str1 = "I love Java"; String str2 = new String("I love Java"); String str3 = new String("And I love programming"); }} int result = str1.compareto(str2); System.out.println(result); result = str2.compareto(str3); System.out.println(result); 20

Comparable CompareTo() (2/4) Για να ταξινομήσουμε αντικείμενα (π.χ. πίνακα αντικειμένων) ως προς κάποιο χαρακτηριστικό τους, μπορούμε να χρησιμοποιήσουμε την Array.sort(), αφού όμως προηγουμένως έχουμε δηλώσει ότι τα αντικείμενα υλοποιούν (implements) την διεπαφή Comparable και υπερβαίνουν (override) την μέθοδο ComareTo(). Διαφορετικά η Array.sort() δεν θα δουλέψει (θα πάρουμε μήνυμα λάθους) στην ταξινόμηση αντικειμένων. Το παρακάτω παράδειγμα ταξινομεί τα βότανα ως προς την ποσότητα. import java.util.arrays; class Votana implements Comparable<Votana>{ private String VotanoName; private String VotanoDesc; private int quantity; public Votana(String VotanoName, String VotanoDesc, int quantity){ super(); this.votanoname = VotanoName; this.votanodesc = VotanoDesc; this.quantity = quantity; } 21

Comparable CompareTo() (3/4) public String getvotanoname() {return VotanoName;} public void setvotanoname(string VotanoName) {this.votanoname = VotanoName;} public String getvotanodesc() {return VotanoDesc;} public void setvotanodesc(string VotanoDesc) {this.votanodesc = VotanoDesc;} public int getquantity() {return quantity;} public void setquantity(int quantity) {this.quantity = quantity;} public int compareto(votana comparevotana) { int comparequantity = ((Votana)compareVotana).getQuantity(); //ascending order return this.quantity - comparequantity; //descending order: //return comparequantity - this.quantity; }} 22

Comparable CompareTo() (4/4) class SortVotanaObjects{ public static void main(string args[]){ Votana[] votano = new Votana[4]; Votana tea = new Votana("Tea", "Tsai-prasino vounou ",4); Votana chamomile = new Votana("Chamomile", "Chamonhli vounou",20); Votana oregano = new Votana("Oregano", "Rigani vounou",6); Votana pepper = new Votana("Pepper", "Piperi mauro",8); votano[0]=tea; votano[1]=chamomile; votano[2]=oregano; votano[3]=pepper; }} Arrays.sort(votano); int i=0; for(votana temp: votano){ System.out.println("votano " + ++i + " : " + temp.getvotanoname() +", Perigrafi: " + temp.getvotanodesc()+", Posotita: " + temp.getquantity()+ Kila );} 23

Cloneable (1/4) Cloneable : Για να δημιουργήσουμε ένα ακριβές αντίγραφο (copy) ενός αντικειμένου με την χρήση της μεθόδου clone() της κλάσης Object. Κάνουμε υπέρβαση (override) της μεθόδου clone() και καλό είναι να χρησιμοποιούμε την: throws CloneNotSupportedException, στην υπογραφή της μεθόδου. Παράδειγμα: class CloneableName implements Cloneable { private String Aname; public CloneableName(String n) {this.aname = n;} public String getname() {return Aname;} // Overriding clone() method of Object class public Object clone()throws CloneNotSupportedException{ return (CloneableName)super.clone(); } 24

Cloneable (2/4) public static void main(string[] args) { CloneableName obj1 = new CloneableName("Petros"); try { CloneableName obj2 = (CloneableName)obj1.clone(); System.out.println(obj2.getName()); } catch (CloneNotSupportedException e) { e.printstacktrace(); } }} Προσέξτε την χρήση της try catch. Η εξαίρεση CloneNotSupportedException λαμβάνεται όταν εκτελέσουμε την μέθοδο clone(), χωρίς την υλοποίηση της διεπαφής cloneable. 25

Cloneable (3/4) Παράδειγμα: Η κλήση της clone() μπορεί να γίνει και μέσα από άλλη μέθοδο. class CopyObject implements Cloneable { int x; double y; // H methodos kalei tin clone() tis Object CopyObject mycloneobject() { }} try { // klisi tis clone return (CopyObject)super.clone(); } catch(clonenotsupportedexception e) { System.out.println("Lathos stin antigrafi!!"); return null; } 26

Cloneable (4/4) class CloneDemo1 { public static void main(string args[]) { CopyObject z1 = new CopyObject(); CopyObject z2; z1.x = 9; z1.y = 7.40; z2 = z1.mycloneobject(); // clone z1 System.out.println("z1: " + z1.x + " " + z1.y); System.out.println("z2: " + z2.x + " " + z2.y); }} 27