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



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

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

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

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

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

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

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

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

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

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Σύνθεση και Κληρονομικότητα

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

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

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

Σύνθεση και Κληρονομικότητα

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

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

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

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

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

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

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

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

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

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

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

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

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

3 Αλληλεπίδραση Αντικειμένων

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

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

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

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

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

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

Wrapper Classes, Abstract Classes and Interfaces

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

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

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Τελικό τεστ - απαντήσεις

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

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

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

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

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

Transcript:

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Υπερφόρτωση (Overloading), Μεθόδων (Method Overloading), Τελεστών (Operator Overloading (C++, C#)) - Υπερσκέλιση Μεθόδων (Method Overriding) - Δυναμική Πρόσδεση (Late(Dynamic) Binding) - Upcasting/Downcasting Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 1

Πολυμορφισμός (polymorphism) Πολύ: πολλές, πολλαπλές, Μορφή: χαρακτήρας, εμφάνιση, απεικόνιση, Πολλαπλές μορφές Ο πολυμορφισμός είναι μία από τις πιο βασικές έννοιες του αντικειμενοστρεφή προγραμματισμού. Σχετίζεται με την αποσύνδεση των μεθόδων από τους τύπους ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 2

Είδη Πολυμορφισμού Υπερφόρτωση (Overloading) Μεθόδων (Method Overloading) Τελεστών (Operator Overloading (C++, C#)) Υπερσκέλιση Μεθόδων (Method Overriding) Δυναμική Πρόσδεση (Late (Dynamic) Binding) Upcasting/Downcasting ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 3

Υπερφόρτωση Μεθόδων (Method Overloading) Παραδείγματα της πραγματικής ζωής: Παίζω μπάλα Παίζω το πιάνο Παίζω ένα DVD Παίζω με ένα παιχνίδι Η λέξη Παίζω χρησιμοποιείται με διαφορετική έννοια Παραδείγματα του προγραμματισμού: Constructor Overloading Method Overloading ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 4

Παράδειγμα Method Overloading public static void method() { public static void method(int x) { public static void method(int x, String y) { Constructor Overloading class Circle { double radius; Circle () { this (1.0); Circle (double newradius) { radius = newradius; ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 5

Υπερφόρτωση Τελεστών (Operator Overloading) Παραδείγματα της πραγματικής ζωής: Προσθέτω δύο αριθμούς Προσθέτω στη σακούλα μου ένα μήλο και ένα αχλάδι Προσθέτω ζάχαρη στον καφέ μου Προσθέτω ξύλα στο τζάκι Η έννοια της πρόσθεσης είναι αόριστη εκτός και αν είναι συσχετισμένη με κάποια συμφραζόμενα Προσοχή: Αν και οι τελεστές είναι συχνά συνδεδεμένοι με μαθηματικές πράξεις, δεν είναι τίποτα άλλο από καλέσματα μεθόδων ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 6

Παράδειγμα Operator Overloading (C#) Υποθέστε κλάση MyObjμε μεταβλητές inta, intb public static MyObj operator + (MyObj x, MyObj y) { return new MyObj(x.a+y.a, x.b+y.b); public static MyObj operator == (MyObj x, MyObj y) { if (x.a == y.a && x.b == y.b) return true; return false; public static MyObj operator!= (MyObj x, MyObj y) { if (x.a!= y.a x.b!= y.b) return true; return false; ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 7

Υπερσκέλιση (Override) vs.υπερφόρτωση (Overload) Η Υπερφόρτωση (overload) μπορεί να πραγματοποιηθεί: είτε στην ίδια κλάση με ορισμό μεθόδων με το ίδιο όνομα ή μέσω κληρονομικότητας με ορισμό μεθόδων με το ίδιο όνομα Η Υπερσκέλιση (Overriding) μπορεί να συμβεί μόνο μέσω κληρονομικότητας Οι ακόλουθες δηλώσεις μεθόδων ΔΕΝ μπορούν υπερσκελιθούν: private static(εκτός και αν ) final ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 8

Παράδειγμα Overloading vs. Overriding Όταν γίνεται χρήση overrideπως μπορούμε να έχουμε πρόσβαση στην μέθοδο της υπερκλάσης;;; Μόνο μέσω του super(κάλεσμα μέσα από άλλη μέθοδο); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 9

Overriding: Αποδυνάμωση/Ενδυνάμωση Μία υποκλάση δεν μπορεί να αποδυναμώσει την πρόσβαση σε μία μέθοδο που γίνεται override Μπορεί όμως να την ενδυναμώσει Παράδειγμα: class parent { //package-level void m(){ class child extends parent { void m(){ //OK protected void m(){ //OK public void m(){ //OK private void m(){ //NOT OK ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 10

Overriding static, final methods Μία υποκλάση δεν μπορεί να κάνει override μία static methodεκτός και αν είναι static.γιατί;;;;;;;;;;;;;;; class parent { //package-level static void m(){ class child extends parent { static void m(){ //OK void m(){ //NOT OK Η πρόσδεση στατικών μεθόδων και μεταβλητών γίνεται πριν την έναρξη του προγράμματος early (static) binding Μία υποκλάση δεν μπορεί να κάνει override μία final method. ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 11

Πρόσδεση (Binding) Πρόσδεση (Binding) συμβαίνει όταν: Συνδέεται μία μεταβλητή με μία τιμή Συνδέεται το κάλεσμα μίας μεθόδου με υλοποίησή της Δύο είδη Πρόσδεσης Early (static) Binding:συμβαίνει πριν να τρέξει το πρόγραμμα από τον μεταγλωττιστή ή linker. H compilers της C υποστηρίζουν μόνο αυτό. Late (dynamic) Binding:συμβαίνει όταν η πρόσδεση γίνεται κατά τη διάρκεια εκτέλεσης του προγράμματος ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 12

Late (Dynamic) Binding Ο μεταγλωττιστής δεν γνωρίζει εκ των προτέρων ποιος τύπος θα χρησιμοποιηθεί Για να πραγματοποιηθεί το late binding πρέπει να υπάρχει κάποιος μηχανισμός που καθορίζει τον τύπου του αντικειμένου και την μέθοδο που πρέπει να καλεστεί την συγκεκριμένη στιγμή εκτέλεσης Η JAVA πραγματοποιεί όλα τα method bindings με late binding Εξαίρεση:αν οι μεθόδοι είναι δηλωμένες σαν static ή final Προσοχή:οι μεθόδοι που είναι δηλωμένες σαν private είναι εμμέσως final ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 13

Πολυμορφισμός και Late (Dynamic) Binding Παραδείγματα της πραγματικής ζωής: Διάβασε το Εξέτασε το Τύπωσε το Αντίγραψέ το Η έννοια του αντικείμενου το είναι αόριστη εκτός και αν είναι συσχετισμένη με κάποια συμφραζόμενα Ο πολυμορφισμός δεν έχει σχέση τόσο με τα χαρακτηριστικά (μεταβλητές) της κλάσης όσο με τη συμπεριφορά (μεθόδους) της ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 14

Παράδειγμα: Late (Dynamic) Binding public class PolymorphismDemo { public static void m (Object x) { System.out.println(x.toString()); public static void main(string[] args) { m( new GraduateStudent() ); m( new Student() ); m( new Person() ); m( new Object() ); class GraduateStudent extends Student { class Student extends Person { public String tostring() { return "Student"; class Person extends Object { public String tostring() {return "Person"; Η μέθοδοςm() παίρνει σαν παράμετρο Object Μπορεί να καλεστεί με οποιοδήποτε αντικείμενο αφού όλα τα αντικείμενα κληρωνόμουν από το Object ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 15

Παράδειγμα: Late (Dynamic) Binding public class PolymorphismDemo { public static void m (Object x) { System.out.println(x.toString()); public static void main(string[] args) { m( new GraduateStudent() ); m( new Student() ); m( new Person() ); m( new Object() ); class GraduateStudent extends Student { class Student extends Person { public String tostring() { return "Student"; class Person extends Object { public String tostring() {return "Person"; Η μέθοδοςm() μπορεί να καλεστεί με οποιοδήποτε αντικείμενο κληρονομεί από το αντικείμενο που δέχεται σαν παράμετρος πολυμορφισμός ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 16

Παράδειγμα: Late (Dynamic) Binding public class PolymorphismDemo { public static void m (Object x) { System.out.println(x.toString()); public static void main(string[] args) { m( new GraduateStudent() ); m( new Student() ); m( new Person() ); m( new Object() ); class GraduateStudent extends Student { class Student extends Person { public String tostring() { return "Student"; class Person extends Object { public String tostring() {return "Person"; Όταν εκτελείτε η μέθοδος m()το αντικείμενο μπορεί να είναι του τύπου: GraduateStudent ή Student ή Person ή Object Η κάθε κλάση έχει δική της υλοποίηση για τη μέθοδο tostring() Ποια θα καλεστεί; Αποφασίζεται από την JVM run-time ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 17

Late (Dynamic) Binding Έστω ότι ένα αντικείμενο o είναι ένα στιγμιότυπο της κλάσης C 1,C 2, C n. C n C n-1 C 2 C 1 Αν το αντικείμενο o καλέσει την μέθοδο p() το JVM ψάχνει την υλοποίηση της μεθόδου p() στις κλάσεις C 1, C 2, C n με την σειρά μέχρι να τη βρει. Η πρώτη εκτέλεση που θα βρεθεί, θα εκτελεστεί ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 18

Ταίριασμα(Match) vs. Πρόσδεση(Binding) Μεθόδων Το ταίριασμα μία υπογραφής μεθόδου γίνεται σε επίπεδο μεταγλώττισης σύμφωνα με το όνομα της μεθόδου, τη λίστα των παραμέτρων και το είδος των παραμέτρων Η μέθοδος μπορεί να υλοποιείται από πολλές υποκλάσεις Η JVM προσδέτειδυναμικά την υλοποίηση της μεθόδου κατά τη διάρκεια εκτέλεσης του προγράμματος ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 19

Μετατροπές αντικειμένων (Casting Objects) Το castingμπορεί να χρησιμοποιηθεί για να μετατραπεί ένα αντικείμενο από ένα τύπο σε κάποιο άλλο της ιεραρχία της κληρονομικότητας Παράδειγμα: m( new Student() ); μετατρέπει το Student σε Object Το πιο πάνω είναι ισοδύναμο με Object o = new Student(); m( o ); Έχουμε μετατρέψει ένα αντικείμενο μίας υποκλάσης σε ένα αντικείμενο μίας υπερκλάσης upcasting ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 20

Χωρίς Πολυμορφισμό Shape Attributes Operations public void draw() {. class Shape { public void draw() { class Circle extends Shape { public void draw() { class Triangle extends Shape { public void draw() { class Triangle extends Shape { public void draw() { Circle Attributes Operations public void draw() {. Triangle Attributes Operations public void draw() {. Square Attributes Operations public void draw() {. public class GUI { public static void erase( Circle c ) { public static void erase( Triangle t ) { public static void erase( Square s ) { Υλοποιήσαµε 3 διαφορετικές overloaded µεθόδους public static void main(string args[]) { Circle c = new Circle(); Triangle t = new Triangle(); Square s = new Square(); erase( c ); erase( t ); erase( s ); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 21

Μειονεκτήματα απουσίας του Upcasting Χρειάζεται να γράψουμε 3 ειδικές μεθόδους erase περισσότερος κώδικας. Αν θελήσουμε να προσθέσουμε καινούριες μεθόδους (σαν την erase) ή καινούριες κλάσεις (τύπου Shape) περισσότερη προσπάθεια Μπορεί να μην υλοποιήσουμε μεθόδους για όλα τα είδη αντικειμένων γίνεται πιο εύκολα λογικό λάθος Το upcasting(πολυμορφισμός) μας επιτρέπουν να ορίσουμε μια μέθοδο, στην κλάση-βάσης, και αυτή τη μέθοδο να την χρησιμοποιήσουμε και σε αντικείμενα κλάσεων-κληρονόμων. ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 22

Με Πολυμορφισμό (Upcasting) public class GUI { public static void erase( Shape s ) { public static void main(string args[]) { Υλοποιήσαµε 1µέθοδο µόνο για όλους τις κληρονόµους της κλάσης Shape Circle c = new Circle(); Triangle t = new Triangle(); Square s = new Square(); erase( c ); erase( t ); erase( s ); Το JVM δεν γνωρίζει κατά το compile time τι χειριστήριο θα περάσει στην µέθοδο erase Καθορίζεται στην φάση της εκτέλεσης (late binding) ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 23

Upcasting Shape s = new Circle (); Shape upcasts to Circle Μέσα στο heap δημιουργείται ένα καινούριο αντικείμενο Circle (= new Circle). Υπακούει όμως την διαπροσωπεία της κλάσης Shape Αυτό «περιέχει» ένα αντικείμενο τύπου Shape s.draw(): late binding πολυμορφική κλήση στην Circle.draw() s.getarea() compile error (δεν υπακούει την διαπροσωπεία Shape) ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 24

Upcasting με Abstract Classes/Interfaces Μία αφαιρετική κλάση μπορεί να χρησιμοποιηθεί σαν τύπος, π.χ., GeometricObjectarray = new GeometricObject[10];(μέσω από πολυμορφισμό) Δείκτες σε αντικείμενα μπορούν να έχουν τύπο διαπροσωπείας(μέσω από πολυμορφισμό) Για παράδειγμα: ΙΑnimals a = new Lion(); To IAnimals είναι διαπροσωπεία To Lionείναι κλάση Τι έχουμε πετύχει με την πιο πάνω δήλωση; Μόνο μεθόδοι που ανήκουν στην διαπροσωπεία IAnimals μπορούν να κληθούν! ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 25

Down-Casting vs. Up-Casting Το πιο κάτω δημιουργεί σφάλμα μεταγλώττισης Student s = new Object(); //downcasting Αυτό (Object o = new Student();) όμως ΟΧΙ. Ο λόγος είναι ότι Ένα αντικείμενο τύπου Student περιέχει/είναι ένα αντικείμενο τύπου Object Το αντίστροφο όμως δεν ισχύει, π.χ., Object o = new Αpple(); //ΟΚ Student s = ο; σημαίνει ότι ο s είναι μήλο! Πρέπει να χρησιμοποιηθεί άμεσο/explicitcastingγια να επιτραπεί από τον μεταγλωττιστή π.χ., Student s = (Student) new Object(); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 26

Πολυμορφικές κλήσεις μέσω Κατασκευαστών Τι θα τυπωθεί; abstract class Shape{ abstract void draw(); Shape(){ System.out.println("Shape: before draw()"); draw(); System.out.println("Shape: after draw()"); class Circle extends Shape{ Circle(){ System.out.println("Circle constructor"); void draw() { System.out.println("Circle: draw()"); public class PolymorphismConstructor { public static void main(string[] args) { Circle c = new Circle(); Shape s = new Circle(); Κλήση μία late bindedabstract methodμέσα στον κατασκευαστή της υπερκλάσης, χρησιμοποιεί την overridedmethod στην υποκλάση ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 27

Ο τελεστής <instanceof> Στην java υπάρχει ο τελεστής <instanceof> ο οποίος μας επιτρέπει να ελέγξουμε τον τύπο ενός αντικειμένου Επιστρέφει true ή false Σύνταξη: <object> instanceof <class> Παράδειγμα: if( c instanceof child) System.out.println("child"); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 28

Παράδειγμα <instanceof> Τι θα τυπώσει ο ακόλουθος κώδικας; class parent { public class child extends parent { public static void main(string[] args) { parent p = new child(); if( p instanceof parent) System.out.println("parent"); if( p instanceof child) System.out.println("child"); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 29

Πολυμορφισμός και Covariant return types Τι θα τυπωθεί; class ParentA { public String tostring() { return "ParentA"; class ChildA extends ParentA { public String tostring() { return "ChildA"; class ParentB { ParentA process() { return new ParentA(); class ChildB extends ParentB { ChildA process() { return new ChildA(); public class CovariantReturn { public static void main(string[] args) { ParentB pb = new ParentB(); ParentA pa = pb.process(); System.out.println(pa); pb = new ChildB(); pa = pb.process(); System.out.println(pa); upcasting process() is overridden in ChildB, pa = new ChildA() tostring() is overridden in ParentA by ChildA ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 30

Πολυμορφισμός και Σύνθεση Τι θα τυπωθεί; class Actor { public void act() { class HappyActor extends Actor { public void act() { Sout.println("HappyActor"); class SadActor extends Actor { public void act() { Sout.println("SadActor"); class Stage { private Actor actor = new HappyActor(); public void change() { actor = new SadActor(); public void performplay() { actor.act(); Composition public class performance { public static void main(string[] args) { Stage stage=new Stage(); stage.performplay(); stage.change(); stage.performplay(); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 31