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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Wrapper Classes, Abstract Classes and Interfaces

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

5. Ανασκόπηση αντικειμενοστραφούς προγραμματισμού

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα Downcasting Πολυμορφισμός Late Binding

Προγράμματα με δομή Κληρονομικότητας

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

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

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

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

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

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

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

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

Στο πρόγραμμα θα πρέπει να γίνει υποχρεωτικά χρήση κλάσεων. Για την υλοποίηση του προγράμματος χρειάζονται 3 βασικές κλάσεις.

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

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

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

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

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

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

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


Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

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

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

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

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

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

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

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

Προγράμματα με δομή Κληρονομικότητας

Transcript:

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 29/5/2017 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr

Περίληψη επιτρεπτών εκχωρήσεων μεταξύ μεταβλητών υπερκλάσεων και υποκλάσεων Κανόνες εκχώρησης αναφοράς υπερκλάσεων και υποκλάσεων Εκχώρηση αναφοράς υπερκλάσης σε μεταβλητή υπερκλάσης είναι οκ Εκχώρηση αναφοράς υποκλάσης σε μεταβλητή υποκλάσης είναι οκ Εκχώρηση αναφοράς υποκλάσης σε μεταβλητή υπερκλάσης (widening) είναι ασφαλής λόγω της «είναι μία is a» σχέσης Αναφορά σε μέλη υποκλάσης μόνο μέσω μεταβλητών υπερκλάσης είναι σφάλμα μεταγλώττισης Εκχώρηση αναφοράς υπερκλάσης σε μεταβλητή υποκλάσης (narrowing) είναι σφάλμα μεταγλώττισης Ο υποβιβασμός τύπου λύνει αυτό το πρόβλημα

Shadowing members μεταβλητή υπερκλάσης περιέχει αναφορά σε αντικείμενο υποκλάσης, άρα μέθοδος υποκλάσης!

Πολυμορφισμός Είναι δυνατός λόγω: Κληρονομικότητας υποκλάσεις κληρονομούν πεδία και μεθόδους της υπερκλάσης Method overriding υποκλάσεις μπορούν να ξαναορίσουν μεθόδους που κληρονομούνται από την υπερκλάση Πολυμορφικές μεταβλητές Μεταβλητές που μπορούν να κρατούν την τιμή διαφορετικών τύπων (classes)

Μελέτη περίπτωσης: δημιουργία και χρήση διασυνδέσεων (Interfaces) Επανεξέταση συστήματος μισθοδοσίας Εκτός από υπολογισμό μισθών, υπολογισμός πληρωμών για διάφορα τιμολόγια Λειτουργίες που αναφέρονται σε άσχετα πράγματα μεταξύ τους, περιλαμβάνουν όμως κάποιο είδος πληρωμής Για τον εργαζόμενο: πληρωμή αποδοχών Για το τιμολόγιο: πληρωμή κόστους προϊόντων Μπορεί η Java να απαιτεί από άσχετες μεταξύ τους κλάσεις να υλοποιούν ένα σύνολο κοινών μεθόδων? Ναι! Διασυνδέσεις!

Μελέτη περίπτωσης: δημιουργία και χρήση διασυνδέσεων (Interfaces) Interfaces Keyword interface Περιέχει μόνο σταθερές και abstract μεθόδους Όλα τα πεδία είναι εμμέσως public, static και final Όλες οι μέθοδοι είναι εμμέσως public abstract Οι κλάσεις implement interfaces Η κλάση πρέπει να δηλώνει κάθε μέθοδο του interface με την υπογραφή που καθορίστηκε στη δήλωση του interface,αλλιώς η κλάση πρέπει να δηλωθεί abstract Συνήθως χρησιμοποιείται όταν ανόμοιες κλάσεις πρέπει να μοιραστούν κοινές μεθόδους και σταθερές Συνήθως δηλώνεται σε ένα αρχείο με το ίδιο όνομα με το interface και την επέκταση αρχείου.java

Ανάπτυξη μιας ιεραρχίας Payable Payable interface Περιέχει τη μέθοδο getpaymentamount Υλοποιείται από τις κλάσεις Invoice και Employee Στη UML τα interfaces αναπαρίστανται ως εξής Διακρίνονται από τις κλάσεις βάζοντας τη λέξη interface σε εισαγωγικά πάνω από το όνομα της διασύνδεσης Η σχέση μεταξύ μίας κλάσης και μίας διασύνδεσης εκφράζεται μέσω της σχέσης γνωστής ως «πραγματοποίηση» ή «υλοποίηση» Μία κλάση λέμε ότι «πραγματοποιεί» ή «υλοποιεί» τις μεθόδους μιας διασύνδεσης

Παρατήρηση Σύμφωνα με το κεφάλαιο 9 του Java Language Specification, είναι καλό να δηλώνονται όλες οι μέθοδοι διασύνδεσης χωρίς τα keywords public και abstract, επειδή είναι πλεονασμός σε δηλώσεις μεθόδων διασύνδεσης. Παρόμοια, οι σταθερές θα πρέπει να δηλώνονται χωρίς τα keywords public, static και final γιατί είναι επίσης πλεονασμός.

Προγραμματιστικό λάθος Η αποτυχία υλοποίησης οποιασδήποτε μεθόδου διασύνδεσης σε μία ειδική κλάση που υλοποιεί (implements) τη διασύνδεση, καταλήγει σε συντακτικό λάθος που υποδεικνύει ότι η κλάση πρέπει να δηλώνεται ως abstract 2005 Pearson Education, Inc. All rights reserved.

Διάγραμμα κλάσεων UML ιεραρχίας διασύνδεσης Payable

1 // Fig. 10.11: Payable.java 2 // Payable interface declaration. 3 4 public interface Payable 5 { 6 double getpaymentamount(); // calculate payment; no implementation 7 } // end interface Payable Declare interface Payable Declare getpaymentamount method which is implicitly public and abstract

1 // Fig. 10.12: Invoice.java 2 // Invoice class implements Payable. 3 4 public class Invoice implements Payable 5 { 6 private String partnumber; 7 private String partdescription; 8 private int quantity; 9 private double priceperitem; 10 11 // four-argument constructor 12 public Invoice( String part, String description, int count, 13 double price ) 14 { 15 partnumber = part; 16 partdescription = description; 17 setquantity( count ); // validate and store quantity 18 setpriceperitem( price ); // validate and store price per item 19 } // end four-argument Invoice constructor 20 21 // set part number 22 public void setpartnumber( String part ) 23 { Constructor με τέσσερα ορίσματα (part, description, count, price) Getters και setters για όλα τα πεδία/μεταβλητές στιγμιοτύπου tostring() What else? 24 partnumber = part; 25 } // end method setpartnumber 26

1 // Fig. 10.12: Invoice.java 2 // Invoice class implements Payable. 3 4 public class Invoice implements Payable 5 { 6 private String partnumber; 7 private String partdescription; 8 private int quantity; 9 private double priceperitem; 10 11 // four-argument constructor 12 public Invoice( String part, String description, int count, 13 double price ) 14 { 15 partnumber = part; 16 partdescription = description; 17 setquantity( count ); // validate and store quantity 18 setpriceperitem( price ); // validate and store price per item 19 } // end four-argument Invoice constructor 20 21 // set part number 22 public void setpartnumber( String part ) 23 { 24 partnumber = part; 25 } // end method setpartnumber 26 Class Invoice implements interface Payable

27 // get part number 28 public String getpartnumber() 29 { 30 return partnumber; 31 } // end method getpartnumber 32 33 // set description 34 public void setpartdescription( String description ) 35 { 36 partdescription = description; 37 } // end method setpartdescription 38 39 // get description 40 public String getpartdescription() 41 { 42 return partdescription; 43 } // end method getpartdescription 44 45 // set quantity 46 public void setquantity( int count ) 47 { 48 quantity = ( count < 0 )? 0 : count; // quantity cannot be negative 49 } // end method setquantity 50 51 // get quantity 52 public int getquantity() 53 { 54 return quantity; 55 } // end method getquantity 56

57 // set price per item 58 public void setpriceperitem( double price ) 59 { 60 priceperitem = ( price < 0.0 )? 0.0 : price; // validate price 61 } // end method setpriceperitem 62 63 // get price per item 64 public double getpriceperitem() 65 { 66 return priceperitem; 67 } // end method getpriceperitem 68 69 // return String representation of Invoice object 70 public String tostring() 71 { 72 return String.format( "%s: \n%s: %s (%s) \n%s: %d \n%s: $%,.2f", 73 "invoice", "part number", getpartnumber(), getpartdescription(), 74 "quantity", getquantity(), "price per item", getpriceperitem() ); 75 } // end method tostring 76 77 // method required to carry out contract with interface Payable 78 public double getpaymentamount() 79 { 80 return getquantity() * getpriceperitem(); // calculate total cost 81 } // end method getpaymentamount 82 } // end class Invoice Declare getpaymentamount to fulfill contract with interface Payable

Δημιουργία κλάσης Invoice Μία κλάση μπορεί να υλοποιήσει όσα interfaces χρειάζεται Χρησιμοποιούμε μία λίστα διαχωρισμένη με κόμμα με τα ονόματα των interfaces μετά το keyword implements public class ClassName extends SuperclassName implements FirstInterface, SecondInterface,

1 // Fig. 10.13: Employee.java 2 // Employee abstract superclass implements Payable. 3 4 public abstract class Employee implements Payable 5 { 6 private String firstname; 7 private String lastname; 8 private String socialsecuritynumber; 9 10 // three-argument constructor 11 public Employee( String first, String last, String ssn ) 12 { 13 firstname = first; 14 lastname = last; 15 socialsecuritynumber = ssn; 16 } // end three-argument Employee constructor 17 Class Employee implements interface Payable

18 // set first name 19 public void setfirstname( String first ) 20 { 21 firstname = first; 22 } // end method setfirstname 23 24 // return first name 25 public String getfirstname() 26 { 27 return firstname; 28 } // end method getfirstname 29 30 // set last name 31 public void setlastname( String last ) 32 { 33 lastname = last; 34 } // end method setlastname 35 36 // return last name 37 public String getlastname() 38 { 39 return lastname; 40 } // end method getlastname 41

42 // set social security number 43 public void setsocialsecuritynumber( String ssn ) 44 { 45 socialsecuritynumber = ssn; // should validate 46 } // end method setsocialsecuritynumber 47 48 // return social security number 49 public String getsocialsecuritynumber() 50 { 51 return socialsecuritynumber; 52 } // end method getsocialsecuritynumber 53 54 // return String representation of Employee object 55 public String tostring() 56 { 57 return String.format( "%s %s\nsocial security number: %s", 58 getfirstname(), getlastname(), getsocialsecuritynumber() ); 59 } // end method tostring 60 61 // Note: We do not implement Payable method getpaymentamount here so 62 // this class must be declared abstract to avoid a compilation error. 63 } // end abstract class Employee getpaymentamount method is not implemented here

Τροποποίηση κλάσης SalariedEmployee για υλοποίηση του Payable Αντικείμενα των υποκλάσεων της κλάσης που υλοποιεί το interface μπορούν επίσης να θεωρηθούν ως αντικείμενα του interface Αναφορά σε αντικείμενο υποκλάσης εκχωρείται σε interface variable αν η υπερκλάση υλοποιεί αυτό το interface

Παρατήρηση Όλα τα αντικείμενα μιας κλάσης που υλοποιεί πολλές διασυνδέσεις έχουν μία σχέση «είναι ένα» με κάθε τύπο υλοποιούμενης διασύνδεσης

1 // Fig. 10.14: SalariedEmployee.java 2 // SalariedEmployee class extends Employee, which implements Payable. 3 4 public class SalariedEmployee extends Employee 5 { 6 private double weeklysalary; 7 8 // four-argument constructor 9 public SalariedEmployee( String first, String last, String ssn, 10 double salary ) 11 { 12 super( first, last, ssn ); // pass to Employee constructor 13 setweeklysalary( salary ); // validate and store salary 14 } // end four-argument SalariedEmployee constructor 15 16 // set salary 17 public void setweeklysalary( double salary ) 18 { 19 weeklysalary = salary < 0.0? 0.0 : salary; 20 } // end method setweeklysalary 21 Class SalariedEmployee extends class Employee (which implements interface Payable)

22 // return salary 23 public double getweeklysalary() 24 { 25 return weeklysalary; 26 } // end method getweeklysalary 27 28 // calculate earnings; implement interface Payable method that was 29 // abstract in superclass Employee 30 public double getpaymentamount() 31 { 32 return getweeklysalary(); 33 } // end method getpaymentamount 34 35 // return String representation of SalariedEmployee object 36 public String tostring() 37 { 38 return String.format( "salaried employee: %s\n%s: $%,.2f", 39 super.tostring(), "weekly salary", getweeklysalary() ); 40 } // end method tostring 41 } // end class SalariedEmployee Declare getpaymentamount method instead of earnings method

Παρατήρηση Όταν η παράμετρος μιας μεθόδου δηλώνεται με ένα τύπο υπερκλάσης ή διασύνδεσης, η μέθοδος επεξεργάζεται πολυμορφικά το αντικείμενο που έλαβε ως όρισμα

1 // Fig. 10.15: PayableInterfaceTest.java 2 // Tests interface Payable. 3 4 public class PayableInterfaceTest 5 { 6 public static void main( String args[] ) 7 { 8 // create four-element Payable array 9 Payable payableobjects[] = new Payable[ 4 ]; 10 11 // populate array with objects that implement Payable 12 payableobjects[ 0 ] = new Invoice( "01234", "seat", 2, 375.00 ); 13 payableobjects[ 1 ] = new Invoice( "56789", "tire", 4, 79.95 ); 14 payableobjects[ 2 ] = 15 new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 ); 16 payableobjects[ 3 ] = 17 new SalariedEmployee( "Lisa", "Barnes", "888-88-8888", 1200.00 ); 18 19 System.out.println( 20 "Invoices and Employees processed polymorphically:\n" ); 21 Declare array of Payable variables Assigning references to SalariedEmployee objects to Payable variables

22 // generically process each element in array payableobjects 23 for ( Payable currentpayable : payableobjects ) 24 { 25 // output currentpayable and its appropriate payment amount 26 System.out.printf( "%s \n%s: $%,.2f\n\n", 27 currentpayable.tostring(), 28 "payment due", currentpayable.getpaymentamount() ); 29 } // end for 30 } // end main 31 } // end class PayableInterfaceTest Invoices and Employees processed polymorphically: invoice: part number: 01234 (seat) quantity: 2 price per item: $375.00 payment due: $750.00 invoice: part number: 56789 (tire) quantity: 4 price per item: $79.95 payment due: $319.80 salaried employee: John Smith social security number: 111-11-1111 weekly salary: $800.00 payment due: $800.00 salaried employee: Lisa Barnes social security number: 888-88-8888 weekly salary: $1,200.00 payment due: $1,200.00 Call tostring and getpaymentamount methods polymorphically

Παρατήρηση Χρησιμοποιώντας μία αναφορά υπερκλάσης, μπορούμε πολυμορφικά να καλέσουμε οποιαδήποτε μέθοδο δηλώνεται στην υπερκλάση της και τις υπερκλάσεις της (δηλ. και στην κλάση Object). Χρησιμοποιώντας μία αναφορά διασύνδεσης, μπορούμε πολυμορφικά να καλέσουμε οποιαδήποτε μέθοδο δηλώνεται στη διασύνδεση, υπερσυνδέσεις της (μία διασύνδεση μπορεί να επεκτείνει μία άλλη διασύνδεση) και στην κλάση Object.

Δήλωση σταθερών με χρήση Interfaces Τα interfaces μπορούν να χρησιμοποιηθούν για να δηλώσουν σταθερές που χρησιμοποιούνται σε πολλές δηλώσεις κλάσεων Αυτές οι σταθερές είναι implicitly public, static and final Χρησιμοποιώντας μία δήλωση static import επιτρέπεται σε πελάτες να χρησιμοποιήσουν αυτές τις σταθερές μόνο με τα ονόματά τους

Συνοψίζοντας Interfaces Ένα Java interface είναι συλλογή σταθερών και abstract μεθόδων Ορίζουμε ένα interface όπως και μία κλάση Αλλά προσδιορίζουμε μόνο τις μεθόδους χωρίς την υλοποίηση Μία κλάση που υλοποιεί ένα interface πρέπει να παρέχει υλοποιήσεις για όλες τις μεθόδους που ορίζονται στο interface!!!!

Interfaces και Κλάσεις

Interfaces

Interfaces και Abstract Classes Ομοιότητες μεταξύ interfaces και abstract classes Και τα δύο ορίζουν abstract methods Εντούτοις, μία κλάση μπορεί να υλοποιήσει πολλαπλά interfaces, αλλά μπορεί να προκύψει μόνο από μία abstract κλάση Η Java δεν υποστηρίζει πολλαπλή κληρονομικότητα κλάσεων Μία κλάση που υλοποιεί πολλαπλά interfaces τα προσδιορίζει όλα στο header χωρισμένα με,

Παράδειγμα Abstract class: μία κλάση με μία τουλάχιστον μη υλοποιημένη μέθοδο Interface: μία κλάση με μόνο μη υλοποιημένες μεθόδους

Παραδείγματα Θεωρήστε την παρακάτω διεπαφή αντικειµένων (interface) Java: interface I { } int f1(); boolean f2(int i); Η παρακάτω δήλωση της κλάσης γίνεται αποδεκτή ή ΟΧΙ από το μεταφραστή της Java και πιο συγκεκριμένα από τον ελεγκτή τύπων? class C1 implements I { public int f1() { return 2; } public boolean f2(int j) { return false; } } ΝΑΙ!!!!

Παραδείγματα Θεωρήστε την παρακάτω διεπαφή αντικειµένων (interface) Java: interface I { } int f1(); boolean f2(int i); Η παρακάτω δήλωση της κλάσης γίνεται αποδεκτή ή ΟΧΙ από το μεταφραστή της Java και πιο συγκεκριμένα από τον ελεγκτή τύπων? class C2 implements I { public int f1(int i) { return i; } public boolean f2(int j) { return false; } } ΟΧΙ...

Παραδείγματα Θεωρήστε την παρακάτω διεπαφή αντικειµένων (interface) Java: interface I { } int f1(); boolean f2(int i); Η παρακάτω δήλωση της κλάσης γίνεται αποδεκτή ή ΟΧΙ από το μεταφραστή της Java και πιο συγκεκριμένα από τον ελεγκτή τύπων? class C3 implements I { } public int f1() { return 2; } ΟΧΙ...

Παραδείγματα Θεωρήστε την παρακάτω διεπαφή αντικειµένων (interface) Java: interface I { } int f1(); boolean f2(int i); Η παρακάτω δήλωση της κλάσης γίνεται αποδεκτή ή ΟΧΙ από το μεταφραστή της Java και πιο συγκεκριμένα από τον ελεγκτή τύπων? class C4 implements I { public int f1() { return 0; } public boolean f2(int j) { return false; } public void foo() { } } ΝΑΙ!!!!

Πηγές/Acknowledgements http://java.sun.com/j2se H. M. Deitel, P. J. Deitel, Java Προγραμματισμός, 6η έκδοση, Μ. Γκιούρδας, 2006 D. Barnes, M. Kolling, Αντικειμενοστρεφής Προγραμματισμός σε Java, Κλειδάριθμος, 2008 Βασίλης Χριστοφίδης, Αντικειμενοστρεφής Προγραμματισμός, Πανεπιστήμιο Κρήτης Κ. Τσαγκάρης, Εισαγωγή στις εφαρμογές της Java, Πανεπιστήμιο Πειραιώς Jones, Evan, Adam Marcus, and Eugene Wu. 6.092 Introduction to Programming in Java,January IAP 2010. (Massachusetts Institute of Technology: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 10 Mar, 2013). License: Creative Commons BY-NC-SA