Θέματα ΟΕΦΕ 2022

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

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

donquixote

Γεια σας.
Θα ήθελα να ρωτήσω αν και πού μπορούμε να βρούμε τα τελευταία θέματα ΟΕΦΕ 2022.
Ευχαριστώ.

dpa2006

#1
Καλησπέρα,
νομίζω πως είναι νωρίς ακόμη...
https://www.panellinies.net/aepp-oefe-2022/

ΠΡΟΓΡΑΜΜΑ ΕΞΕΤΑΣΕΩΝ ΟΕΦΕ 2022
https://epan.oefe.cloud/CMS/site/pdf/%CE%A0%CE%A1%CE%9F%CE%93%CE%A1%CE%91%CE%9C%CE%9C%CE%91%20%CE%95%CE%98%202022.pdf
Computer science (abbreviated CS or CompSci) is the scientific and practical approach to computation and its applications. It is the systematic study of the feasibility, structure, expression, and mechanization of the methodical processes (or algorithms) that underlie the acquisition, representation, processing, storage, communication of, and access to information, whether such information is encoded in bits and bytes in a computer memory or transcribed engines and protein structures in a human cell.source:http://en.wikipedia.org/wiki/Computer_science

ΤΙΜ

Καλησπέρα έχει βρει κάποιος τα φετινά θέματα της Ο.Ε.Φ.Ε. ;

Γιάννης Σ.


epsilonXi

Στο Β2.10 έχω τη διαφωνία μου...
στις λύσεις το δίνουν σωστό

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

Καλημέρα

συμφωνώ και εγώ, αλλά δεν ΄ξέρω αν μπορούμα να το συζητήσουμε επίσημα...έχουν βγει τα θέματα ??

petrosp13

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

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

η μέθοδος ΔέχεταιΠαραγγελία() που είναι πολυμορφική, κληρονομείται ή απλά υλοποιείται με διαφορετικό τρόπο ?? εγώ λάθος θα το έλεγα, 2 μεθόδους έχει η Β...αλλά είναι λίγο μπέρδεμα, δε διευκρινίζει το βιβλίο το σημείο αυτό

ΤΙΜ

Παράθεση από: Γιάννης Σ. στις 05 Μαΐου 2022, 11:12:08 ΜΜhttp://host.keystone.gr/news/knnewsfile.php?R=542&ID=891&SID=5467

Αυτά εδώ; Δεν είμαι σίγουρος... ;)
Σε ευχαριστώ πάρα πολύ να είσαι καλά ! Καλή δύναμη και επιτυχία στους μαθητές σας ! 

ΜΑΘΗΤΡΙΑ

θα μπορουσε καποιος να στειλει και τις λυσεις;ειμαι μαθητρια της γ το ελυσα και θελω να τα ελεγξω !Σας ευχαριστώ 

sstauross

Έχει μηπως κάποιος τις απαντήσεις στα θέματα;
Ευχαριστώ!

pgrontas

Παράθεση από: Λαμπράκης Μανώλης στις 06 Μαΐου 2022, 02:50:33 ΜΜη μέθοδος ΔέχεταιΠαραγγελία() που είναι πολυμορφική, κληρονομείται ή απλά υλοποιείται με διαφορετικό τρόπο ?? εγώ λάθος θα το έλεγα, 2 μεθόδους έχει η Β...αλλά είναι λίγο μπέρδεμα, δε διευκρινίζει το βιβλίο το σημείο αυτό
Συμφωνώ, σε ένα αντικείμενο β τύπου B μπορεί κάποιος να καλέσει 2 μεθόδους.
β.ΔέχεταιΠαραγγελία() και β.ΚάνειΣυνεργασία().
Η ομώνυμη μέθοδος της υπερκλάσης Α παρακάμπτεται στο Β, δεν υπάρχει και αυτή. Αλλιώς πώς θα μπορούσε κάποιος να ξεχωρίσει ποια από τις δύο θέλει. 
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

George Eco

Παράθεση από: pgrontas στις 07 Μαΐου 2022, 04:20:57 ΜΜΑλλιώς πώς θα μπορούσε κάποιος να ξεχωρίσει ποια από τις δύο θέλει.
Και πάλι όμως, είτε καλούσε τη superclass από την υλοποίησή της, είτε έκανε τα δικά της, τίποτα δεν άλλαζει.
Οι μέθοδοι είναι ΔΥΟ κι όχι τρεις. Συμφωνώ κι εγώ.
Οτιδήποτε προσπαθήσει να στηρίξει το τρεις, ενδεχομένως βγαίνει εκτός ύλης, έτσι κι αλλιώς. Κάνω λάθος; ???

pgrontas

#13
Παράθεση από: George Eco στις 07 Μαΐου 2022, 05:20:32 ΜΜΚαι πάλι όμως, είτε καλούσε τη superclass από την υλοποίησή της, είτε έκανε τα δικά της, τίποτα δεν άλλαζει.
Οι μέθοδοι είναι ΔΥΟ κι όχι τρεις. Συμφωνώ κι εγώ.
Οτιδήποτε προσπαθήσει να στηρίξει το τρεις, ενδεχομένως βγαίνει εκτός ύλης, έτσι κι αλλιώς. Κάνω λάθος; ???
Το τρεις είναι λάθος, όχι εκτός ύλης. Θα  μου έκανε μεγάλη εντύπωση αν (σε κάποια κουφή γλώσσα) κρατούσες και την παλιά και την νέα έκδοση μιας πολυμορφικής μεθόδου. Σε όσες γλώσσες έχω συναντήσει, αν θες να αναφερθείς στην μέθοδο της υπερκλάσης, πρέπει να κάνεις casting, οπότε ουσιαστικά μετατρέπεις το αντικείμενο τύπου Β σε τύπου Α, ή χρησιμοποιείς κάποια λέξη κλειδί πχ. super που πάλι αναφέρεται στην Α.
Η κλάση Β έχει δύο μεθόδους.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

akouts

Ποιος ο λόγος η κλάση Α να υλοποιεί την ΔέχεταιΠαραγγελία(), αφού και στις δύο υποκλάσεις αυτή υλοποιείται ξανά; 

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

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

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

evry

Παράθεση από: KosTzag στις 13 Μαΐου 2022, 08:35:59 ΠΜΣυμφωνώ ότι σαν πρώτη σκέψη είναι λάθος.

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

Εξάλλου αν δεχτούμε την 8η πρόταση ως σωστή, γιατί η 6η να είναι λάθος;
Πολύ σωστή παρατήρηση. Το συγκεκριμένο ΣΛ είναι απαράδεκτο, αφού η Β κληρονομεί από την Α και προφανώς θα έχει και όλα όσα έχει η Α. Αν μιλάγαμε για Private και Protected ίσως να είχε κάποιο νόημα αλλά και πάλι ελέγχεται.
Ήθελε άλλη διατύπωση.
Το έσωσαν με την λέξη μόνο, ώστε όλοι να καταλάβουν τι εννοούν αλλά και πάλι δεν είναι σωστό.

Για άλλη μια φορά με τις αλχημείες αυτού του μαθήματος έχουμε φτάσει να μιλάμε για ένα νέο είδους αντικειμενοστρεφούς προγραμματισμού αυτόν που λέει το σχολικό βιβλίο.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gthal

Παναγιώτη, μελέτησα πολύ καλά το μήνυμά σου, ευχαριστώ για τη λεπτομέρειά του. Είναι όλα πολύ "to the point"!
Ακριβώς όπως το λες, εγώ δε μπορώ να αποσυνδέσω το συγκεκριμένο είδος πολυμορφισμού από την κληρονομική σχέση!
Παράθεση από: pgrontas στις 13 Μαΐου 2022, 12:40:35 ΜΜΣτο παράδειγμα σου με τη λίστα η μία Εισαγωγή πολυμορφίζει την άλλη.
Δες στον παρακάτω κώδικα (μη υπαρκτής αλλά pythonοειδούς γλώσσας προγραμματισμού) τι πλεονέκτημα έχει αυτό:
Από το παράδειγμά σου κατάλαβα αμέσως δύο πράγματα.
  • είναι ζήτημα ορισμού (δηλ αν θα ονομάσω την επίμαχη περίπτωση πολυμορφισμό ή όχι - και εν τέλει είναι απλά θεωρητικό ζήτημα, γιατί αν ο προγραμματιστής "θέλει" την ευκολία τού να έχει δύο μεθόδους με το ίδιο όνομα σε ασυσχέτιστες κλάσεις και αν αυτό μπορεί να το κάνει αφ' ενός και δουλεύει αφ' ετέρου, ποσώς τον ενδιαφέρει αν είναι πολυμορφισμός ή όχι)
  • ανήκουμε σε διαφορετικές "σχολές": εγώ είμαι επηρεασμένος κατά βάση από την Java, ενώ εσύ μάλλον από την python. Και είναι γεγονός ότι το παράδειγμά σου θα δούλευε στην python αλλά όχι στην Java. 
Η λίστα των δύο Λιστών που φτιάχνεις (παρακάτω τη λέω "μεγάλη" λίστα) θα ήταν αποδεκτή στην python, νομίζω χάρη στην χαλαρότητά της με τους τύπους.
Η Java δεν θα άφηνε να φτιάξουμε μια τέτοια λίστα, με αντικείμενα διαφορετικού τύπου. Θα μας "ανάγκαζε" λοιπόν να δούμε τις δύο λίστες μας (ταξινομημένη και αταξινόμητη) ως υποκλάσεις ενός κοινού τους προγόνου (το οποίο κάνει και πολύ νόημα, μιας και οι Λίστες μας δεν είναι άσχετα πράγματα αλλά έχουν ειδοποιούς ομοιότητες). Ο κοινός αυτός πρόγονος θα όριζε πως κάθε μέλος του θα διαθέτει μια μέθοδο εισαγωγή (την οποία κάθε μέλος μπορεί να πολυμορφίσει αν θέλει) και για αυτό και μόνο το λόγο θα μπορούσε να κληθεί η εισαγωγή σε κάθε αντικείμενο της "μεγάλης" μας λίστας. Αν δεν ορίσουμε έναν κοινό τους πρόγονο με αυτό το χαρακτηριστικό, και ο άμεσος κοινός τους πρόγονος θεωρηθεί το Object (δηλαδή προστεθούν οι δύο λίστες στην "μεγάλη" λίστα ως Objects), δεν θα είναι δυνατή η κλήση στην εισαγωγή, παρότι την διαθέτουν και οι δύο, γιατί δεν είναι ορατή αν τα βλέπουμε ως απλά Objects.
Ανέτρεξα τελικά στη βιβλιογραφία  :laugh:
Πώς ορίζεται τελικά ο πολυμορφισμός;; Πρέπει να σου πω ότι τα πρώτα 7-8 άρθρα που διάβασα έλεγαν αυτό που λέω εγώ (είναι πάντα μια προγονική μέθοδος η οποία υπερκαλύπτεται) κι ετοιμαζόμουν να σου πω ότι κάνεις λάθος. Αυτά τα άρθρα είχαν αναφορές σε java, c++, c# και 1-2 άλλες γλώσσες που δεν θυμάμαι τώρα και έχασα τα tabs. Τελικά αναζήτησα συγκεκριμένα για τον πολυμορφισμό στην python και βρήκα όντως άρθρο που αναφέρει και την περίπτωση που λες κι εσύ. Σωστά και τα δύο λοιπόν! Αναλόγως σε ποια "σχολή" είσαι.
Δεν θα αποφύγω να πω όμως δυο λόγια υπέρ της "αυστηρής" σχολής  :angel:
Έχω βλαστημήσει τη java άπειρες φορές που δε με άφηνε να κάνω αυτό που διαισθητικά ήθελα! Τελικά την ευγνωμονώ γιατί με ανάγκασε να καταλάβω καλύτερα τι κάνω. Και τελικά πάντα υπήρχε ένας τρόπος να το κάνω. Πιο σωστός και πιο δομημένος. Όπως ακριβώς βλαστημούσα τον δομημένο προγραμματισμό όταν τον πρωτοδιδάχτηκα, μαθημένος-αυτοδίδακτος στην "ελευθερία" της BASIC και της GOTO. Κάποια στιγμή αντιλήφθηκα τη μαγεία του και πόσο νόημα έχει να υποχρεωθείς να μείνεις στη δομή. Και πάντα υπήρχε ο τρόπος να γίνει αυτό που ήθελα. Και σωστότερα!
Από την άλλη, η python μου έχει λύσει προβλήματα "γρήγορα και βρώμικα" (δόξα τω Θεώ), πολλές φορές μάλιστα χωρίς να καταλαβαίνω ακριβώς τι κάνω, και δε με νοιάζει γιατί δεν σκοπεύω να επανέλθω. Με νοιάζει που δούλεψε χωρίς να με ταλαιπωρήσει. Δε μπορώ όμως να διανοηθώ πώς θα μπορούσα να βρω άκρη στον ίδιο τον δικό μου κώδικα αν έγραφα ένα μεγάλο πρόγραμμα και συνέχιζα να εκμεταλλεύομαι τις ελευθερίες που παρέχει. (γιαυτό και έχω δεύτερες σκέψεις αν είναι καλή γλώσσα για τον αρχάριο που δομεί τη γνώση του σε όλα αυτά- κλείνει η παρένθεση)
Θέλω να καταλήξω στο ότι υπάρχει καλή και "λιγότερο καλή" αντικειμενοστραφής σχεδίαση. Μια καλή σχεδίαση προκύπτει από καλή κατανόηση των σχέσεων των κλάσεών μας, των αλληλεξαρτήσεων και φυσικά των συνεργασιών τους. Διαφορετικά μπορεί να καταλήξει το πρόγραμμά μας να είναι ένας σωρός από κλάσεις και αντικείμενα σκόρπια και "ξέμπαρκα" που με κάποιον τρόπο προσπαθούν να συνεργαστούν μεταξύ τους.
Η 1η υλοποίηση στο σχήμα που είχα στείλει είναι καλύτερη από τη 2η και ακόμα καλύτερη από κάποια 3η στην οποία δεν θα είχαμε καν κοινό πρόγονο στα δύο είδη Λιστών μας. Ο 1ος προγραμματιστής έχει καταλάβει καλύτερα από τους άλλους δύο (και έχει αξιοποιήσει) τις σχέσεις και την ειδοποιό ομοιότητα των αντικειμένων του. Έχει καταλάβει πως υπάρχει αιτίαση για τις κοινές μεθόδους και τα ονόματά τους (και δεν τα αντιμετώπισε ως "συμπτώσεις", που επιμένω να το λέω για να γίνει κατανοητό τι εννοώ). Ο κώδικας του 1ου, θα είναι πολύ πιο εύκολος στο να αλλαχθεί, να διορθωθεί και να επεκταθεί χωρίς να προκύψουν bugs, σε αντίθεση με των άλλων δύο, που σε κάθε αλλαγή θα τρέμει το φυλλοκάρδι τους, μην τυχόν ξεχάσουν να ενημερώσουν κατάλληλα και τις άλλες υποκλάσεις.
Δε θα μπορούσα να συμφωνώ περισσότερο με αυτό που λες εδώ, γιαυτό και λέω όσα λέω
Παράθεση από: pgrontas στις 13 Μαΐου 2022, 12:40:35 ΜΜΟ προγραμματιστής επιλέγει. Όμως οι επιλογές έχουν συνέπειες. Έτσι, αν κάποιος ονομάσει με το ίδιο όνομα πετάει() δύο άσχετες μεθόδους (ενώ για τη μία εννοεί ίπταται() ενώ για την άλλη ρίχνει()), θα μπορεί να τις καλέσει πολυμορφικά αλλά το πρόγραμμα πιθανώς να μη βγάζει νόημα και έτσι να δημιουργηθούν bugs.
Γι' αυτό σου έγγραψα (και επιμένω) ότι όταν επιλέγουμε κάποιο όνομα πρέπει να είμαστε συνειδητοποιημένοι γιατί αυτό έχει συνέπειες.
Λέμε το ίδιο. Ο προγραμματιστής που δεν καταλαβαίνει ότι οι δύο μέθοδοι πετάει() έχουν το ίδιο όνομα από σύμπτωση και όχι γιατί υπάρχει κάποια αιτίαση για αυτό (ακόμα κι αν επιλέγει αυτή τη σύμπτωση για ευκολία και να μη θυμάται πολλά ονόματα μεθόδων) ίσως να έχει πρόβλημα αργότερα! Αν μάλιστα θεωρεί κιόλας ότι η μία πολυμορφίζει την άλλη επειδή απλά και μόνο έχουν το ίδιο όνομα, βρίσκεται σε μεγάλη πλάνη. Δεν του λέω να αλλάξει όνομα αλλά να καταλαβαίνει τι σημαίνει το ένα και τι το άλλο και να αντιλαμβάνεται την ειδοποιό διαφορά τους. Αυτές οι δύο δε μπορεί να συσχετιστούν και υπάρχει αιτία για αυτό (και όπως έχεις καταλάβει, για μένα είναι η μη κοινή "καταγωγή" τους)
Ομοίως, εκείνος που δεν καταλαβαίνει ότι οι δύο μέθοδοι εισαγωγή() δεν έχουν ίδιο όνομα από τύχη (ή απλά από επιλογή για την ευκολία) αλλά έχουν ειδοποιό ομοιότητα, ώστε να την αποδώσει στην υπερκλάση, επίσης κάτι χάνει από την ουσία.
Το ίδιο και εκείνος που επιλέγει να μην πει τη μέθοδο συνένωση() για να την κρατήσει σε αντιστοιχία με την πρόσθεση(), δε θα πρέπει να του διαφύγει το γεγονός ότι όλα τα αντικείμενα που θέλει να "προσθέσει" ανήκουν σε μια ευρύτερη οικογένεια, των "προσθέσιμων", και χάρη σ' αυτό το γεγονός μπορεί να ενοποιήσει τις μεθόδους που τα "προσθέτουν", παραλλάσσοντας φυσικά την καθεμιά. Αν δε συνειδητοποιήσει δηλαδή πως η επιλογή του δεν αφορά στιγμιαία/τοπικά μόνο τη μέθοδό του και το όνομά της αλλά αφορά τη Δομή ολόκληρου του συστήματός του, νομίζω ότι κι αυτός θα συναντήσει προβλήματα στη συνέχεια.
Αυτά τα λίγα :)
Τη χάρηκα τη συζήτηση.
Φιλικά,
Γιώργος Θαλασσινός

bagelis

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



isle

Γεια σας.
Θα ήθελα να ρωτήσω αν και πού μπορούμε να βρούμε τις λυσεις γι τα θέματα ΟΕΦΕ 2022.
Ευχαριστώ

Νίκος Αδαμόπουλος

Παράθεση από: pgrontas στις 11 Μαΐου 2022, 07:46:09 ΜΜΜπορούμε να έχουμε πολυμορφισμό χωρίς κληρονομικότητα.
Πχ. με interfaces όπως στη Java αλλά και με overloading όπως κάνει πχ. η Python στους τελεστές.

H C++ έχει πολυμορφισμό ακόμα και σε επίπεδο απλών functions, δηλαδή χωρίς κατ' ανάγκη να γίνεται λόγος για κλάσεις, κληρονομικότητες κλπ. Π.χ. μπορούμε να έχουμε με το ίδιο όνομα:

int megalyteros(int a, int b);
int megalyteros(int a, int b, int c);
double megalyteros(double a, double b);

κλπ, στο ίδιο πρόγραμμα.

Γενικά συμφωνώ με τον pgrontas...