ΕΠΛ233 ΔΙΑΠΡΟΣΩΠΕΙΕΣ

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

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

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

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

Wrapper Classes, Abstract Classes and Interfaces

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

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

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

ΕΠΛ233 Επαναχρησιμοποίηση Κλάσεων

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

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

API: Applications Programming Interface

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

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

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

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

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

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

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

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

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

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

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

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

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

Κεφάλαιο 15 Γλώσσα προγραμματισμού Java

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

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

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

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

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

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


ΕΠΛ233 Βασικά στοιχεία προγραµµατισµού στη JAVA

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης:

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

Transcript:

ΔΙΑΠΡΟΣΩΠΕΙΕΣ

Αφαιρετικές Μέθοδοι Στα προηγούμενα παραδείγματα, οι μέθοδοι της κλάσεως-κληροδότη Instrument είναι "πλασματικές", με την έννοια ότι ο ορισμός τους γίνεται για τον καθορισμό μιας διαπροσωπείας κοινής σε όλες τις κλάσεις-κληρονόμους της (common interface). H Java μας επιτρέπει να δηλώνουμε ρητά ορισμένες μεθόδους μιας κλάσης σαν αφαιρετικές ώστε: Να έχουμε τη δυνατότητα να προσδιορίζουμε την διαπροσωπεία της κλάσης που τις περιέχει. Να αποτρέπεται η εκ παραδρομής κλήση τους από άλλες μεθόδους. Ο προσδιορισμός μιας μεθόδου ως αφαιρετικής γίνεται ως εξής: abstract void X(); Μ. Δικαιάκος 2

Αφαιρετικές Κλάσεις Μ. Δικαιάκος Μια κλάση η οποία περιλαμβάνει έστω και μια «αφαιρετική» μέθοδο, καθίσταται επίσης αφαιρετική και πρέπει να δηλωθεί ως αφαιρετική. Τι συμβαίνει αν προσπαθήσουμε να δημιουργήσουμε ένα αντικείμενο από κάποια αφαιρετική κλάση; Εφόσον μια κλάση κληρονομεί από μια αφαιρετική κλάση, και θέλουμε να δημιουργήσουμε αντικείμενα γι' αυτήν, θα πρέπει η κλάση μας να περιέχει τους ορισμούς για όλες τις αφαιρετικές μεθόδους της κλάσεως-βάσης. Διαφορετικά ο μεταφραστής επιβάλλει να προσδιορίσουμε την κλάση μας σαν αφαιρετική. Μπορούμε τέλος να δηλώσουμε μια κλάση σαν αφαιρετική, χωρίς ωστόσο η κλάση αυτή να περικλείει αφαιρετικές μεθόδους. Γιατί να θέλουµε κάτι τέτοιο; Για να αποκλείσουμε τη δημιουργία αντικειμένων αυτής της κλάσης. 3

4 Διαπροσωπείες-Interfaces H Java επεκτείνει τις ιδέες της αφαιρετικότητας μεθόδων και κλάσεων που καθορίζονται με το abstract, μέσω του interface. Με το interface εισάγεται η έννοια μιας "καθαρής" αφηρημένης κλάσης. Επιτρέπεται έτσι στον προγραμματιστή να καθορίσει τη µορφή μιας κλάσης: ονόματα μεθόδων, καταλόγους παραμέτρων, τύπους επιστροφής, αλλά όχι σώματα μεθόδων. Επίσης, επιτρέπεται ο καθορισμός πεδίων δεδομένων, τα οποία ωστόσο προκαθορίζονται υπορήτως ως στατικά (static) και τελικά (final). Για την δήλωση διαπροσωπειών, χρησιμοποιούμε τη λέξη κλειδί interface στη θέση της λέξης-κλειδί class.

5 Παράδειγμα

6 Παράδειγμα interface Instrument { int i = 5; // static & final void play(); String what(); void adjust(); class Wind implements Instrument { public void play() { System.out.println("Wind.play()"); public String what() { return "Wind"; public void adjust() { class Percussion implements Instrument { public void play() { System.out.println("Percussion.play()"); public String what() { return "Percussion"; public void adjust() {

7 Παράδειγμα (συνέχεια) class Stringed implements Instrument { public void play() { System.out.println("Stringed.play()"); public String what() { return "Stringed"; public void adjust() { class Brass extends Wind { public void play() { System.out.println("Brass.play()"); public void adjust() { System.out.println("Brass.adjust()"); class Woodwind extends Wind { public void play() { System.out.println("Woodwind.play()"); public String what() { return "Woodwind";

8 Παράδειγμα (συνέχεια) 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; orchestra[i++] = new Wind(); orchestra[i++] = new Percussion(); orchestra[i++] = new Stringed(); orchestra[i++] = new Brass(); orchestra[i++] = new Woodwind(); tuneall(orchestra); Doesn't care about type, so new types added to the system still work right Upcasting during addition to the array

Επεξηγήσεις Παρατηρείστε ότι: Δεν έχει σημασία αν γίνεται upcasting σε κανονική κλάση, σε αφηρημένη κλάση ή σε διαπροσωπεία. Η δημοσιότητα της Διαπροσωπείας: Οι διαπροσωπείες μπορούν να προσδιοριστούν ως δηµόσιες (public) ή φιλικές, ακολουθώντας τους ίδιους κανόνες που ακολουθούν οι κανονικές κλάσεις. Οι μέθοδοι μιας διαπροσωπείας εξυπακούονται σαν δημόσιες (αν δεν προσδιοριστούν ρητώς έτσι). Συνεπώς, κατά την υλοποίηση της διαπροσωπείας με κάποια κλάση, οι μέθοδοι της κλάσης πρέπει να δηλωθούν ως δημόσιες. Διαφορετικά προκύπτει περιορισμός της πρόσβασης σε κάποια μέθοδο κατά την κληρονομικότητα, πράγμα που απαγορεύει ο μεταφραστής της Java. 9

10 Πλήρης αποσύνδεση υλοποίησης- Strategy design pattern: αφορά στη δημιουργία μεθόδου, η οποία συμπεριφέρεται με διαφορετικό τρόπο ανάλογα με τα αντικείμενα που περνιούνται στη μέθοδο αυτή σαν παράμετροι. Η μέθοδος περιλαμβάνει το σταθερό τμήμα του αλγορίθμου που πρέπει να εκτελεσθεί. Η στρατηγική αφορά στη διαφοροποίηση της συμπεριφοράς της μεθόδου και αντιστοιχεί σε ένα αντικείμενο που περνιέται σαν παράμετρος στην μέθοδο, και το οποίο περιέχει κώδικα προς εκτέλεση. Παράδειγμα: Mέθοδος Apply.process() δέχεται σαν παραμέτρους ένα αντικείμενο Processor και ένα αντικείμενο Object. O Processor υλοποιεί την στρατηγική, η οποία διαφοροποιεί την συμπεριφορά της κλάσης Apply.

Παράδειγμα import java.util.*; class Processor { public String name() { return getclass().getsimplename(); Object process(object input) { return input; Μ. Δικαιάκος class Upcase extends Processor { 11

class Splitter extends Processor { String process(object input) { // The split() argument divides a String into pieces: return Arrays.toString(((String)input).split(" ")); public class Apply { public static void process(processor p, Object s) { print("using Processor " + p.name()); print(p.process(s)); public static String s = "Disagreement with beliefs is by definition incorrect"; public static void main(string[] args) { process(new Upcase(), s); process(new Downcase(), s); Μ. Δικαιάκος 12

13 Παράδειγμα (συνέχεια) Η παραπάνω μέθοδος (Apply.process) δεν μπορεί ωστόσο να εφαρμοστεί σε κλάσεις που δεν κληρονομούν από την Processor, ακόμα κι αν έχουν την ίδια διαπροσωπεία. Π.χ.: public class Filter { public String name() { return getclass().getsimplename(); public Waveform process(waveform input) { return input; Η μή δυνατότητα χρήσης της Filter σε συνδυασμό με την Apply.process ώστε να γίνει επαναχρησιμοποίηση του κώδικα της Apply.process για τις ανάγκες

14 Παράδειγμα (συνέχεια) public interface Processor { String name(); Object process(object input); public class Apply { public static void process(processor p, Object s) { print("using Processor " + p.name()); print(p.process(s)); Η επαναχρησιμοποίηση του κώδικα της Apply μπορεί να γίνει εφόσον οι προγραμματιστές γράφουν τις κλάσεις τους λαμβάνοντας υπόψη τη διαπροσωπεία Processor.

Επαναχρησιμοποίηση Interface public abstract class StringProcessor implements Processor{ public String name() { return getclass().getsimplename(); public abstract String process(object input); public static String s = "If she weighs the same as a duck, she's made of wood"; public static void main(string[] args) { Apply.process(new Upcase(), s); Apply.process(new Downcase(), s); Apply.process(new Splitter(), s); Μ. Δικαιάκος 15

Επαναχρησιμοποίηση Interface class Upcase extends StringProcessor { public String process(object input) { // Covariant return return ((String)input).toUpperCase(); class Downcase extends StringProcessor { public String process(object input) { return ((String)input).toLowerCase(); class Splitter extends StringProcessor { public String process(object input) { return Arrays.toString(((String)input).split(" ")); Μ. Δικαιάκος 16

17 Άλλοι τρόποι επαναχρησιμοποίησης Συχνά δεν υπάρχει δυνατότητα να τροποποιήσουμε κάποιες κλάσεις, τις οποίες θέλουμε να χρησιμοποιήσουμε: Αν π.χ. οι κλάσεις αυτές ανήκουν σε βιβλιοθήκες τις οποίες δεν έχουμε υλοποιήσει εμείς οι ίδιοι. Στις περιπτώσεις αυτές μπορούμε να προσαρμόσουμε τις κλάσεις που μας ενδιαφέρουν στη Διαπροσωπεία που χρειαζόμαστε, χρησιμοποιώντας το Adapter design pattern. Στο ακόλουθο παράδειγμα, θα εφαρμόσουμε το Adapter στις κλάσεις Filter.

Filter.java: η κλάση που μας public class Filter { public String name() { return getclass().getsimplename(); public Waveform process(waveform input) { return input; public class Waveform { private static long counter; private final long id = counter++; public String tostring() { return "Waveform " + id; Μ. Δικαιάκος 18

Filter.java public class LowPass extends Filter { double cutoff; public LowPass(double cutoff) { this.cutoff = cutoff; public Waveform process(waveform input) { return input; // Dummy processing public class HighPass extends Filter { double cutoff; public HighPass(double cutoff) { this.cutoff = cutoff; public Waveform process(waveform input) { return input; Μ. Δικαιάκος 19

20 Filter.java public class BandPass extends Filter { double lowcutoff, highcutoff; public BandPass(double lowcut, double highcut) { lowcutoff = lowcut; highcutoff = highcut; public Waveform process(waveform input) { return input;

FilterAdapter class FilterAdapter implements Processor { Filter filter; public FilterAdapter(Filter filter) { this.filter = filter; public String name() { return filter.name(); public Waveform process(object input) { return filter.process((waveform)input); public class FilterProcessor { public static void main(string[] args) { Waveform w = new Waveform(); Apply.process(new FilterAdapter(new LowPass(1.0)), w); Apply.process(new FilterAdapter(new HighPass(2.0)), w); Apply.process( Μ. Δικαιάκος 21

«Πολλαπλή» Κληρονομικότητα Μια Διαπροσωπεία (interface), δεν έχει καθόλου υλοποίηση και δεν δεσμεύει μνήμη. Συνεπώς, μπορούμε να συνδυάσουμε πολλές διαπροσωπείες μαζί στην κληροδότηση κάποιας κλάσης. Στην C++, μια κλάση μπορεί να κληρονομεί από περισσότερες της μιας κλάσης. Μ. Δικαιάκος Αυτό δεν είναι δυνατόν στην JAVA. Μπορούμε ωστόσο να συνδυάσουμε πολλές διαπροσωπείες μαζί, τις οποίες να υλοποιεί από κοινού μια κλάση της JAVA, δίνοντάς μας μια μορφή πολλαπλής κληρονοµικότητας (multiple 22

23 Παράδειγμα Πολλαπλής Κληρον. import java.util.*; interface CanFight {void fight(); interface CanSwim {void swim(); interface CanFly {void fly(); class ActionCharacter { public void fight() { class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly { public void swim() { public void fly() {

24 Παράδειγμα Πολλαπλής Κληρον. public class Adventure { 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 i = new Hero(); t(i); // Treat it as a CanFight u(i); // Treat it as a CanSwim v(i); // Treat it as a CanFly w(i); // Treat it as an ActionCharacter

25 Η χρησιμότητα των Διαπροσωπειών Μας παρέχουν τη δυνατότητα να κάνουμε upcasting σε περισσότερους από έναν τύπους-βάσης, όπως στο προηγούμενο παράδειγμα. Αποτρέπουν τη δημιουργία αντικειμένων για κάποια συγκεκριμένη κλάση (όπως και όταν μια κλάση είναι αφηρημένη). Προτιμάτε τις διαπροσωπείες από τις αφηρημένες κλάσεις, στις περιπτώσεις που θέλετε να κατασκευάσετε βασικές κλάσεις κληροδότες, χωρίς οποιουσδήποτε ορισμούς μεθόδων και πεδία δεδομένων. Οι Διαπροσωπείες μπορούν να επεκταθούν με τη χρήση κληρονομικότητας

26 Κληρονομικότητα στις Διαπροσωπείες interface Monster { void menace(); interface DangerousMonster extends Monster { void destroy(); interface Lethal { void kill(); class DragonZilla implements DangerousMonster { public void menace() { public void destroy() { interface Vampire extends DangerousMonster,Lethal{ void drinkblood(); class VeryBadVampire implements Vampire { public void menace() { public void destroy() { public void kill() { public void drinkblood() {

27 Κληρονομικότητα στις Διαπροσωπείες public class HorrorShow { static void u(monster b) { b.menace(); static void v(dangerousmonster d) { d.menace(); d.destroy(); static void w(lethal l) { l.kill(); public static void main(string[] args) { DangerousMonster barney = new DragonZilla(); u(barney); v(barney); Vampire vlad = new VeryBadVampire(); u(vlad); v(vlad); w(vlad);

28 Συγκρούσεις ονομάτων σε συνδυασμό διαπροσωπειών interface I1 { void f(); interface I2 { int f(int i); interface I3 { int f(); class C { public int f() { return 1; class C2 implements I1, I2 { public void f() { public int f(int i) { return 1; class C3 extends C implements I2 { public int f(int i) { return 1; class C4 extends C implements I3 { public int f() { return 1; class C5 extends C implements I1 { interface I4 extends I1, I3 {

29 Αρχικοποιήσεις μελών Διαπροσωπείας Τα πεδία των διαπροσωπειών έχουν προκαθοριστεί να είναι στατικά και τελικά. Ωστόσο, μπορούμε να τα αρχικοποιούμε με μησταθερές εκφράσεις. Η αρχικοποίηση γίνεται την στιγμή που φορτώνεται η διαπροσωπεία, όταν δηλ. γίνει αναφορά στα πεδία της. import java.util.*; public interface RandVals { Random rand = new Random(); int randomint = rand.nextint(10); long randomlong = rand.nextlong() * 10; float randomfloat = rand.nextlong() * 10; double randomdouble = rand.nextdouble() * 10;