Θέματα ΟΕΦΕ 2022

Ξεκίνησε από donquixote, 16 Απρ 2022, 11:10:48 ΜΜ

« προηγούμενο - επόμενο »

Λαμπράκης Μανώλης

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

petrosp13

Λάθος μου παιδιά, είδα λάθος το όνομα της μεθόδου της υπερκλάσης
Εννοείται ότι είναι δυο οι μέθοδοι τελικά
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

pgrontas

#17
Παράθεση από: akouts στις 07 Μαΐου 2022, 07:24:08 ΜΜΠοιος ο λόγος η κλάση Α να υλοποιεί την ΔέχεταιΠαραγγελία(), αφού και στις δύο υποκλάσεις αυτή υλοποιείται ξανά;
Τα ονόματα των κλάσεων Α,Β δεν μας βοηθούν να καταλάβουμε το χώρο του προβλήματος για να είμαστε συγκεκριμένοι, αλλά σε μια πραγματική εφαρμογή στην υπερκλάση θα μπορούσε να υπάρχει μια γενική υλοποίηση, ενώ στις υποκλάσεις πιο συγκεκριμένες που να εκμεταλλευονται τα ειδικά χαρακτηριστικά τους.
Στο πρόγραμμα μπορεί να υπάρχουν τα αντικείμενα όλων των κλάσεων (και της υπερκλάσης και των υποκλάσεων,) οπότε να υπάρχει μια ποικιλία στη συμπεριφορά ανάλογα με τον τύπο του αντικειμένου του οποίου η μέθοδος καλείται.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

George Eco

Παράθεση από: pgrontas στις 07 Μαΐου 2022, 05:41:06 ΜΜΤο τρεις είναι λάθος, όχι εκτός ύλης. Θα  μου έκανε μεγάλη εντύπωση αν (σε κάποια κουφή γλώσσα) κρατούσες και την παλιά και την νέα έκδοση μιας πολυμορφικής μεθόδου. Σε όσες γλώσσες έχω συναντήσει, αν θες να αναφερθείς στην μέθοδο της υπερκλάσης, πρέπει να κάνεις casting, οπότε ουσιαστικά μετατρέπεις το αντικείμενο τύπου Β σε τύπου Α, ή χρησιμοποιείς κάποια λέξη κλειδί πχ. super που πάλι αναφέρεται στην Α.
Η κλάση Β έχει δύο μεθόδους.

Είπα να μη το πω, αλλά ναι! Πες το override, πες το overload, πες το όπως θες, πάντως δε κάνει όπως εικάζεται. Είναι όντως λάθος, όπως και να έχει. Το είπα εκτός ύλης, με τακτ. Τι να πω; Ότι έχασα τα λογικά μου και ρωτούσα γιατί επί 2 λεπτά; Ε, μετά είπα κι εγώ πως είναι λάθος και προχώρησα με τη ζωή μου. Μικρό το κακό πάντως. Για εμάς τουλάχιστο.

akouts

Παράθεση από: pgrontas στις 07 Μαΐου 2022, 08:13:15 ΜΜΤα ονόματα των κλάσεων Α,Β δεν μας βοηθούν να καταλάβουμε το χώρο του προβλήματος για να είμαστε συγκεκριμένοι, αλλά σε μια πραγματική εφαρμογή στην υπερκλάση θα μπορούσε να υπάρχει μια γενική υλοποίηση, ενώ στις υποκλάσεις πιο συγκεκριμένες που να εκμεταλλευονται τα ειδικά χαρακτηριστικά τους.
Στο πρόγραμμα μπορεί να υπάρχουν τα αντικείμενα όλων των κλάσεων (και της υπερκλάσης και των υποκλάσεων,) οπότε να υπάρχει μια ποικιλία στη συμπεριφορά ανάλογα με τον τύπο του αντικειμένου του οποίου η μέθοδος καλείται.
Εάν δεν υπήρχε η ΔέχεταιΠαραγγελία() στην υπερκλάση, θα είχαμε πολυμορφισμό;

pgrontas

Παράθεση από: akouts στις 08 Μαΐου 2022, 01:48:19 ΜΜΕάν δεν υπήρχε η ΔέχεταιΠαραγγελία() στην υπερκλάση, θα είχαμε πολυμορφισμό;
Ναι  αλλά για να το συσχετίσω με τα προηγούμενα δεν θα μπορούσε η υπερκλαση να δεχτεί παραγγελίες. 
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gthal

Παράθεση από: akouts στις 08 Μαΐου 2022, 01:48:19 ΜΜΕάν δεν υπήρχε η ΔέχεταιΠαραγγελία() στην υπερκλάση, θα είχαμε πολυμορφισμό;
Νομίζω ότι δεν θα μιλάγαμε για πολυμορφισμό. Είναι σαν να έχω δύο υποπρογράμματα με ίδιο όνομα σε δύο διαφορετικά προγράμματα. Δεν έχουν καμία συσχέτιση μεταξύ τους.
Φιλικά,
Γιώργος Θαλασσινός

pgrontas

Παράθεση από: gthal στις 11 Μαΐου 2022, 06:37:47 ΜΜΝομίζω ότι δεν θα μιλάγαμε για πολυμορφισμό. Είναι σαν να έχω δύο υποπρογράμματα με ίδιο όνομα σε δύο διαφορετικά προγράμματα. Δεν έχουν καμία συσχέτιση μεταξύ τους.
Μπορούμε να έχουμε πολυμορφισμό χωρίς κληρονομικότητα.
Πχ. με interfaces όπως στη Java αλλά και με overloading όπως κάνει πχ. η Python στους τελεστές. 
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gthal

Ίσως έχεις δίκιο αλλά για να καταλάβει ο συνομιλητής που ρώτησε,
(που υποθέτω ότι ρωτάει σε σχέση με τη σχολική ύλη) ας αφήσουμε έξω τα interfaces.
Γιατί εδώ θα περιπλέξουν τα πράγματα και κυρίως δεν μπορούν να αντιστοιχιστούν σε καμία έννοια της σχολικής θεωρίας. Οπότε για εμάς δεν υπάρχουν interfaces.
Πάνω στο σχήμα λοιπόν που συζητάμε, και με δεδομένη την υπόθεση που κάνει ο akouts, ότι η υπερκλάση δεν διαθέτει μέθοδο ΔέχεταιΠαραγγελία(), επιμένω ότι δεν μπορούμε να ονομάσουμε πολυμορφισμό το γεγονός ότι οι δύο υποκλάσεις τυχαίνει να έχουν η καθεμία τους μία μέθοδο με όνομα  ΔέχεταιΠαραγγελία(). Οι δύο αυτές μέθοδοι είναι ασυσχέτιστες και το κοινό τους όνομα θα έλεγα πως είναι "σύμπτωση". Χαρακτηριστικά μάλιστα, θα μπορούσαν να μετονομαστούν σε μεθ1() και μεθ2() και να μην αλλάξει καθόλου η λειτουργικότητα (και φυσικά να μη διαμαρτυρηθεί κανένας μεταγλωττιστής). Ενώ, αντιθέτως, είναι χαρακτηριστικό ότι μια μέθοδος που πολυμορφίζεται, θα έχει το ίδιο όνομα σε όλες τις κλάσεις (υποκλάσεις-υπερκλάσεις) της ιεραρχίας, οι οποίες την υλοποιούν.
Φιλικά,
Γιώργος Θαλασσινός

pgrontas

#24
Αν λάβουμε υπόψιν την σχολική ύλη, πάλι έχουμε πολυμορφισμό, αφού αυτός ορίζεται γενικά ως
Παράθεσημια ιδιότητα του αντικειμενοστραφούς προγραμματισμού με την οποία μια λειτουργία μπορεί να υλοποιείται με πολλούς διαφορετικούς τρόπους
Στο βιβλίο μάλιστα έχει δύο παραδείγματα: ένα με την πρόσθεση όπου δεν το συνδέει με την κληρονομικότητα και ένα με τα σχήματα όπου το συνδέει.
Άρα και στο σχήμα εφόσον η λειτουργία ΔέχεταιΠαραγγελία() είναι ίδια, υπάρχει πολυμορφισμός είτε υπάρχει στην υπερκλάση είτε όχι για τον ίδιο λόγο που αναφέρεται και η πρόσθεση ως πολυμορφική.
Επιπλέον στην άσκηση Ε.2 δέχεται ότι ο πολυμορφισμός είναι η δυνατότητα αντικειμένων να διαθέτουν μεθόδους με ίδιο όνομα αλλά διαφορετική υλοποίηση (δική μου σημείωση: οποιονδήποτε αντικειμένων).
Τα παραπάνω συμβαδίζουν και με την πραγματικότητα (στη συγκεκριμένη περίπτωση) όπου η κληρονομικότητα δεν είναι αναγκαία για τον πολυμορφισμό.
Δεν νομίζω ότι είναι κατάλληλο να μιλάμε για συμπτώσεις, ούτε να σκεφτόμαστε ότι οι κλάσεις είναι σαν διαφορετικά προγράμματα . Όλες οι κλάσεις ανήκουν στο ίδιο πρόγραμμα και τα ονόματα (ειδικά στις κλάσεις, ιδιότητες, λειτουργίες) δεν τα διαλέγουμε τυχαία αλλά πρέπει να δείχνουν τη σημασία τους.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

KosTzag

Καλησπέρα σε όλους! Θα ήθελα να κάνω μια ερώτηση: στο Β2 πάντα, το 6 θα το δίνατε ως σωστό ή ως λάθος;

George Eco

Παράθεση από: KosTzag στις 12 Μαΐου 2022, 07:04:11 ΜΜΚαλησπέρα σε όλους! Θα ήθελα να κάνω μια ερώτηση: στο Β2 πάντα, το 6 θα το δίνατε ως σωστό ή ως λάθος;
Είναι ξεκάθαρα λάθος, επειδή έχει και της Α.

gthal

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

Ας αρχίσω με το παράδειγμα του πολυμορφισμού της πρόσθεσης. Αυτό το παράδειγμα δείχνει μια διαφορετική περίπτωση πολυμορφισμού, κατά την οποία μέσα στην ίδια κλάση (ή σε υποκλάσεις της) μπορώ να ορίσω πολλαπλές φορές την ίδια μέθοδο , με διαφορετικά ορίσματα σε κάθε ορισμό της (άρα και διαφορετική «υπογραφή»/signature), ώστε αυτή η μέθοδος να λειτουργεί διαφορετικά σε κάθε περίπτωση, ανάλογα με τα ορίσματά της. Έτσι κι αλλιώς δε συζητάμε για κάτι τέτοιο στο θέμα της ΟΕΦΕ.

Παράθεση από: pgrontas στις 12 Μαΐου 2022, 01:41:49 ΜΜΕπιπλέον στην άσκηση Ε.2 δέχεται ότι ο πολυμορφισμός είναι η δυνατότητα αντικειμένων να διαθέτουν μεθόδους με ίδιο όνομα αλλά διαφορετική υλοποίηση (δική μου σημείωση: οποιονδήποτε αντικειμένων).
Η σημείωση «οποιωνδήποτε αντικειμένων» που προσθέτεις, νομίζω δεν ευσταθεί και μάλλον ευθύνεται για τις παρανοήσεις.
Έστω η κλάση πουλί με μέθοδο πετάει() και η κλάση παίκτης (έστω του ράγκμπυ) με μεθόδους πιάνει(), κλοτσάει(), πετάει(), εννοείται τη μπάλα. Εδώ οι κλάσεις είναι ασυσχέτιστες, οι δύο λειτουργίες που υλοποιούνται με τις μεθόδους πετάει() είναι εντελώς διαφορετικές (δεν έχει νόημα καν η σύγκρισή τους), δεν συσχετίζονται με κανέναν τρόπο, καμία δεν κάνει override την άλλη, και το κοινό τους όνομα είναι όντως σύμπτωση (με την έννοια ότι δεν υπάρχει καμία σκοπιμότητα να έχουν το ίδιο όνομα, απλά τυχαίνει). Θα μπορούσα να μετονομάσω την πρώτη σε ίπταται() ή τη δεύτερη σε ρίχνει() χωρίς να αλλάξει τίποτα στη σχεδίασή μου (ενώ ταυτόχρονα τηρώ και την αρχή πως τα ονόματα παραπέμπουν στην σημασία των μεθόδων και δεν επιλέχτηκαν τυχαία). Ομοίως στην υποθετική ερώτηση του akouts θα μπορούσε η μέθοδος Γ πχ να ονομάζει τη μέθοδο ΛαμβάνειΠαραγγελία() χωρίς πρόβλημα (αν φαίνεται αδόκιμο το μεθ2() που πρότεινα πριν) , πράγμα που δεν θα μπορούσε όμως να γίνει στην περίπτωση που η υπερκλάση Α ορίζει την ΔέχεταιΠαραγγελία() .

Για να δούμε το ερώτημα του akouts σε ένα πιο ρεαλιστικό πλαίσιο, ας δούμε τις δύο υλοποιήσεις στην επισυναπτόμενη εικόνα (αν είναι καλές ή κακές δεν το συζητάμε). Στην 1η υλοποίηση, η ΤαξινομημένηΛίστα επανακαθορίζει την εισαγωγή() προφανώς γιατί θέλει να εισαγάγει το στοιχείο με ταξινομημένο τρόπο. Εδώ είναι φανερό ότι η εισαγωγή() της Ταξινομημένης Λίστας κάνει override την εισαγωγή() της Λίστας (άρα αποτελεί πολυμορφισμό αυτής).
Στη δεύτερη υλοποίηση, η υπερκλάση δεν ορίζει την εισαγωγή(), την οποία ορίζει η κάθε υποκλάση για λογαριασμό της. Εδώ, η εισαγωγή() της Ταξινομημένης Λίστας ποια μέθοδο κάνει override; (οπότε ποιανής αποτελεί πολυμορφισμό; ) Και γιατί να μην την ονομάσει παρεμβολή(), εφόσον θα παρεμβάλλει το στοιχείο στη σωστή του θέση και επιπλέον τα αντικείμενα της κλάσης Λίστα (άρα και της ΤαξινομημένηΛίστα) σε αυτή την υλοποίηση δεν υποχρεούνται να έχουν μέθοδο εισαγωγή() ;

Πολυμορφισμός.png
Φιλικά,
Γιώργος Θαλασσινός

KosTzag

#28
Παράθεση από: George Eco στις 13 Μαΐου 2022, 12:16:28 ΠΜΕίναι ξεκάθαρα λάθος, επειδή έχει και της Α.

Συμφωνώ ότι σαν πρώτη σκέψη είναι λάθος.

Αλλά έχω την εξής δεύτερη σκέψη:
Το ότι δεν αναγράφονται οι ιδιότητες της κλάσης Α στην κλάση Β δεν σημαίνει ότι δεν είναι ιδιότητες της κλάσης Β (προφανώς δεν αναγράφονται στην κλάση Β γιατί κληρονομούνται).
Μήπως θα έπρεπε η πρόταση να είναι «Ένα αντικείμενο της κλάσης Β θα έχει μόνο τις ιδιότητες και τις μεθόδους που αναγράφονται στην κλάση Β»;

Εξάλλου αν δεχτούμε την 8η πρόταση ως σωστή, γιατί η 6η να είναι λάθος;

pgrontas

#29
Γιώργο,

έχεις δίκιο ότι το παράδειγμα πολυμορφισμού με πρόσθεση είναι διαφορετικό είδος πολυμορφισμού (μεν), αλλά είναι πολυμορφισμός (δε).
Με την λογική σου λοιπόν ΔΕΝ απαιτείται η πρόσθεση αλφαριθμητικών να ονομάζεται προσθεση, αλλά θα μπορούσε να ονομάζεται συνένωση. Ναι αλλά τότε ο προγραμματιστής όμως δεν θα μπορούσε να εκμεταλλεύεται το χαρακτηριστικό του πολυμορφισμού με αποτέλεσμα ο κώδικας να είναι πιο σύνθετος καθώς θα έπρεπε να σκέφτεται κάθε φορά τι προσθέτει. Δηλαδή, πολυμορφικά θα μπορούσε να πει Πρόσθεση(χ1,χ2) χωρίς να τον νοιάζει τι είναι τα χ1, χ2. Μη πολυμορφικά θα έπρεπε να σκεφτεί τι τύπο έχουν τα χ1, χ2 ώστε να χρησιμοποιήσει την κατάλληλη μέθοδο.

Ο προγραμματιστής επιλέγει. Όμως οι επιλογές έχουν συνέπειες. Έτσι, αν κάποιος ονομάσει με το ίδιο όνομα πετάει() δύο άσχετες μεθόδους (ενώ για τη μία εννοεί ίπταται() ενώ για την άλλη ρίχνει()), θα μπορεί να τις καλέσει πολυμορφικά αλλά το πρόγραμμα πιθανώς να μη βγάζει νόημα και έτσι να δημιουργηθούν bugs.
Γι' αυτό σου έγγραψα (και επιμένω) ότι όταν επιλέγουμε κάποιο όνομα πρέπει να είμαστε συνειδητοποιημένοι γιατί αυτό έχει συνέπειες.


Στο παράδειγμα σου με τη λίστα η μία Εισαγωγή πολυμορφίζει την άλλη.
Δες στον παρακάτω κώδικα (μη υπαρκτής αλλά pythonοειδούς γλώσσας προγραμματισμού) τι πλεονέκτημα έχει αυτό:
Α=νέα ΜηΤαξινομένηΛιστα()
Β=νέα ΤαξινομημένηΛιστα()
Για χ σε [Α,Β]
   Για υ σε [9,8,7,6,5]
      χ.Εισαγωγη(υ)

Στη μία περίπτωση θα κληθεί η ταξινομημένη εισαγωγή στην άλλη η μη ταξινομημένη. Ο προγραμματιστής δεν χρειάζεται να βάλει if, δεν χρειάζεται να κάνει διπλή δουλειά. Η 'μαγεία' του πολυμορφισμού απλοποιεί έτσι κατά πολύ τον κώδικα.
Θα μπορούσες να το ονομάσεις παρεμβολή, αλλά τότε θα έχανες την ευκολία.

Κατά τη γνώμη μου το λάθος της διαίσθησής σου είναι ότι νομίζεις ότι υποχρεωτικά πρέπει να χρησιμοποιηθεί πολυμορφισμός μέσω κληρονομικότητας επειδή υπάρχει σχέση κλάσης-υποκλάσης. Όμως αυτό δεν ισχύει κατ' ανάγκη. Έτσι ενώ στην ερώτηση του akouts (συμφωνούμε ότι) δεν υπάρχει πολυμορφισμός μέσω κληρονομικότητας (αφού δεν ορίζουμε τη μέθοδο στην υπερκλάση), εσύ αποκλείεις να υπάρχει άλλου είδους πολυμορφισμός ενώ εγώ δέχομαι ότι μπορεί να υπάρχει. Θεωρώ ότι αυτό όχι μόνο δεν απαγορεύεται ούτε από την πραγματικότητα ούτε από τη θεωρία του βιβλίου αλλά υλοποιεί τόσο το πνεύμα όσο και το γράμμα του πολυμορφισμού.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson