Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

5.4 Πολυμορφισμός κλάσσης και Πολυμορφισμός κατά την κληρονομικότητα

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

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

Ο πολυμορφισμός είναι ένα σημαντικό χαρακτηριστικό της αντικειμενοστραφούς προγραμματισμού, καθώς επιτρέπει την επαναχρησιμοποίηση και την ευελιξία του κώδικα.

Παρακάτω παρουσιάζεται ένα παράδειγμα:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class Bird:
def fly(self):
print("Τα πουλιά μπορούν να πετάξουν.")
class Airplane:
def fly(self):
print("Τα αεροπλάνα μπορούν επίσης να πετάξουν.")
# Δημιουργία αντικειμένων
bird = Bird() # Δημιουργία αντικειμένου της κλάσης Bird και αποθήκευση στη μεταβλητή bird
airplane = Airplane() # Δημιουργία αντικειμένου της κλάσης Airplane και αποθήκευση στη μεταβλητή airplane
# Κλήση της μεθόδου fly() για κάθε αντικείμενο
bird.fly() # Κλήση της μεθόδου fly() για το αντικείμενο bird που ανήκει στην κλάση Bird
airplane.fly() # Κλήση της μεθόδου fly() για το αντικείμενο airplane που ανήκει στην κλάση Airplane
class Bird: def fly(self): print("Τα πουλιά μπορούν να πετάξουν.") class Airplane: def fly(self): print("Τα αεροπλάνα μπορούν επίσης να πετάξουν.") # Δημιουργία αντικειμένων bird = Bird() # Δημιουργία αντικειμένου της κλάσης Bird και αποθήκευση στη μεταβλητή bird airplane = Airplane() # Δημιουργία αντικειμένου της κλάσης Airplane και αποθήκευση στη μεταβλητή airplane # Κλήση της μεθόδου fly() για κάθε αντικείμενο bird.fly() # Κλήση της μεθόδου fly() για το αντικείμενο bird που ανήκει στην κλάση Bird airplane.fly() # Κλήση της μεθόδου fly() για το αντικείμενο airplane που ανήκει στην κλάση Airplane
class Bird:
    def fly(self):
        print("Τα πουλιά μπορούν να πετάξουν.")

class Airplane:
    def fly(self):
        print("Τα αεροπλάνα μπορούν επίσης να πετάξουν.")

# Δημιουργία αντικειμένων
bird = Bird()  # Δημιουργία αντικειμένου της κλάσης Bird και αποθήκευση στη μεταβλητή bird
airplane = Airplane()  # Δημιουργία αντικειμένου της κλάσης Airplane και αποθήκευση στη μεταβλητή airplane

# Κλήση της μεθόδου fly() για κάθε αντικείμενο
bird.fly()  # Κλήση της μεθόδου fly() για το αντικείμενο bird που ανήκει στην κλάση Bird
airplane.fly()  # Κλήση της μεθόδου fly() για το αντικείμενο airplane που ανήκει στην κλάση Airplane

Ο παραπάνω κώδικας δημιουργεί δύο κλάσεις, Bird και Airplane, που έχουν μια μέθοδο με το όνομα fly(). Η μέθοδος fly() στην κλάση Bird εκτυπώνει το μήνυμα “Τα πουλιά μπορούν να πετάξουν.”, ενώ η μέθοδος fly() στην κλάση Airplane εκτυπώνει το μήνυμα “Τα αεροπλάνα μπορούν επίσης να πετάξουν.”

Στη συνέχεια, δημιουργούνται δύο αντικείμενα: ένα αντικείμενο με την κλάση Bird που αποθηκεύεται στη μεταβλητή bird, και ένα αντικείμενο με την κλάση Airplane που αποθηκεύεται στη μεταβλητή airplane.

Τέλος, καλείται η μέθοδος fly() για το αντικείμενο bird, με αποτέλεσμα να εκτυπωθεί το μήνυμα “Τα πουλιά μπορούν να πετάξουν.”, και καλείται η μέθοδος fly() για το αντικείμενο airplane, με αποτέλεσμα να εκτυπωθεί το μήνυμα “Τα αεροπλάνα μπορούν επίσης να πετάξουν.”

[adinserter block=”2″]

Ένα άλλο παράδειγμα πολυμορφίας είναι η χρήση της κληρονομικότητας και της υπερκάλυψης μεθόδων:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class Animal:
def speak(self):
pass # Κενή μέθοδος, δεν πραγματοποιείται καμία ενέργεια
class Dog(Animal):
def speak(self):
print("Το σκύλος λέει: Γαβ!") # Εκτύπωση μηνύματος "Το σκύλος λέει: Γαβ!"
class Cat(Animal):
def speak(self):
print("Η γάτα λέει: Νιάου!") # Εκτύπωση μηνύματος "Η γάτα λέει: Νιάου!"
# Δημιουργία αντικειμένων
dog = Dog() # Δημιουργία αντικειμένου της κλάσης Dog
cat = Cat() # Δημιουργία αντικειμένου της κλάσης Cat
# Κλήση της μεθόδου speak() για κάθε αντικείμενο
dog.speak() # Κλήση της μεθόδου speak() για το αντικείμενο dog
cat.speak() # Κλήση της μεθόδου speak() για το αντικείμενο cat
class Animal: def speak(self): pass # Κενή μέθοδος, δεν πραγματοποιείται καμία ενέργεια class Dog(Animal): def speak(self): print("Το σκύλος λέει: Γαβ!") # Εκτύπωση μηνύματος "Το σκύλος λέει: Γαβ!" class Cat(Animal): def speak(self): print("Η γάτα λέει: Νιάου!") # Εκτύπωση μηνύματος "Η γάτα λέει: Νιάου!" # Δημιουργία αντικειμένων dog = Dog() # Δημιουργία αντικειμένου της κλάσης Dog cat = Cat() # Δημιουργία αντικειμένου της κλάσης Cat # Κλήση της μεθόδου speak() για κάθε αντικείμενο dog.speak() # Κλήση της μεθόδου speak() για το αντικείμενο dog cat.speak() # Κλήση της μεθόδου speak() για το αντικείμενο cat
class Animal:
    def speak(self):
        pass  # Κενή μέθοδος, δεν πραγματοποιείται καμία ενέργεια

class Dog(Animal):
    def speak(self):
        print("Το σκύλος λέει: Γαβ!")  # Εκτύπωση μηνύματος "Το σκύλος λέει: Γαβ!"

class Cat(Animal):
    def speak(self):
        print("Η γάτα λέει: Νιάου!")  # Εκτύπωση μηνύματος "Η γάτα λέει: Νιάου!"

# Δημιουργία αντικειμένων
dog = Dog()  # Δημιουργία αντικειμένου της κλάσης Dog
cat = Cat()  # Δημιουργία αντικειμένου της κλάσης Cat

# Κλήση της μεθόδου speak() για κάθε αντικείμενο
dog.speak()  # Κλήση της μεθόδου speak() για το αντικείμενο dog
cat.speak()  # Κλήση της μεθόδου speak() για το αντικείμενο cat

Ο παραπάνω κώδικας ορίζει τρεις κλάσεις: Animal, Dog και Cat. Η κλάση Animal είναι μια βασική κλάση που έχει μια μέθοδο speak() που δεν πραγματοποιεί κάποια ενέργεια. Οι κλάσεις Dog και Cat κληρονομούν από την κλάση Animal και κάθε μία από αυτές υλοποιεί τη μέθοδο speak() με διαφορετικό τρόπο.

Στη συνέχεια, δημιουργούνται δύο αντικείμενα: ένα αντικείμενο της κλάσης Dog με τη μεταβλητή dog και ένα αντικείμενο της κλάσης Cat με τη μεταβλητή cat.

Τέλος, καλούνται οι μέθοδοι speak() για τα αντικείμενα dog και cat, με αποτέλεσμα να εκτυπώνονται τα αντίστοιχα μηνύματα:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Το σκύλος λέει: Γαβ!
Η γάτα λέει: Νιάου!
Το σκύλος λέει: Γαβ! Η γάτα λέει: Νιάου!
Το σκύλος λέει: Γαβ!
Η γάτα λέει: Νιάου!

Έτσι, ο κώδικας εκτελεί τις αντίστοιχες ενέργειες για τα αντικείμενα των κλάσεων Dog και Cat και εμφανίζει τα κατάλληλα μηνύματα.

Μπορούμε να χρησιμοποιήσουμε πολυμορφία με κλάσεις και υποκλάσεις που έχουν το ίδιο όνομα μεθόδου. Μια υποκλάση μπορεί να υπερκαλύψει μια μέθοδο από την γονική κλάση, επιτρέποντας στην υποκλάση να έχει τη δική της εκδοχή της μεθόδου. Αυτό είναι ένα παράδειγμα πολυμορφίας μέσω κληρονομικότητας και υπερκάλυψης μεθόδων.

Παρακάτω παρουσιάζεται ένα παράδειγμα:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class Vehicle:
def move(self):
print("Το όχημα κινείται.")
class Car(Vehicle):
def move(self):
print("Το αυτοκίνητο κινείται.")
class Boat(Vehicle):
def move(self):
print("Το σκάφος κινείται.")
# Δημιουργία αντικειμένων
vehicle = Vehicle() # Δημιουργία ενός αντικειμένου της κλάσης Vehicle
car = Car() # Δημιουργία ενός αντικειμένου της κλάσης Car
boat = Boat() # Δημιουργία ενός αντικειμένου της κλάσης Boat
# Κλήση της μεθόδου move() για κάθε αντικείμενο
vehicle.move() # Κλήση της μεθόδου move() για το αντικείμενο vehicle της κλάσης Vehicle
car.move() # Κλήση της μεθόδου move() για το αντικείμενο car της κλάσης Car
boat.move() # Κλήση της μεθόδου move() για το αντικείμενο boat της κλάσης Boat
class Vehicle: def move(self): print("Το όχημα κινείται.") class Car(Vehicle): def move(self): print("Το αυτοκίνητο κινείται.") class Boat(Vehicle): def move(self): print("Το σκάφος κινείται.") # Δημιουργία αντικειμένων vehicle = Vehicle() # Δημιουργία ενός αντικειμένου της κλάσης Vehicle car = Car() # Δημιουργία ενός αντικειμένου της κλάσης Car boat = Boat() # Δημιουργία ενός αντικειμένου της κλάσης Boat # Κλήση της μεθόδου move() για κάθε αντικείμενο vehicle.move() # Κλήση της μεθόδου move() για το αντικείμενο vehicle της κλάσης Vehicle car.move() # Κλήση της μεθόδου move() για το αντικείμενο car της κλάσης Car boat.move() # Κλήση της μεθόδου move() για το αντικείμενο boat της κλάσης Boat
class Vehicle:
    def move(self):
        print("Το όχημα κινείται.")

class Car(Vehicle):
    def move(self):
        print("Το αυτοκίνητο κινείται.")

class Boat(Vehicle):
    def move(self):
        print("Το σκάφος κινείται.")

# Δημιουργία αντικειμένων
vehicle = Vehicle()  # Δημιουργία ενός αντικειμένου της κλάσης Vehicle
car = Car()  # Δημιουργία ενός αντικειμένου της κλάσης Car
boat = Boat()  # Δημιουργία ενός αντικειμένου της κλάσης Boat

# Κλήση της μεθόδου move() για κάθε αντικείμενο
vehicle.move()  # Κλήση της μεθόδου move() για το αντικείμενο vehicle της κλάσης Vehicle
car.move()  # Κλήση της μεθόδου move() για το αντικείμενο car της κλάσης Car
boat.move()  # Κλήση της μεθόδου move() για το αντικείμενο boat της κλάσης Boat

[adinserter block=”3″]

Ο παραπάνω κώδικας ορίζει τρεις κλάσεις: Vehicle, Car και Boat, που αντιπροσωπεύουν οχήματα. Η κλάση Vehicle είναι η γονική κλάση και έχει μια μέθοδο move() που εκτυπώνει το μήνυμα “Το όχημα κινείται.”.

Οι κλάσεις Car και Boat κληρονομούν από την κλάση Vehicle και καθένα από αυτές έχει μια μέθοδο move() που εκτυπώνει το κατάλληλο μήνυμα για το αυτοκίνητο και το σκάφος αντίστοιχα.

Στη συνέχεια, δημιουργούνται τρία αντικείμενα: vehicle, car και boat, τα οποία ανήκουν στις κλάσεις Vehicle, Car και Boat αντίστοιχα.

Τέλος, καλείται η μέθοδος move() για κάθε αντικείμενο. Έτσι, το μήνυμα “Το όχημα κινείται.” εκτυπώνεται για το αντικείμενο vehicle, το μήνυμα “Το αυτοκίνητο κινείται.” εκτυπώνεται για το αντικείμενο car, και το μήνυμα “Το σκάφος κινείται.” εκτυπώνεται για το αντικείμενο boat.

Η πολυμορφία μας επιτρέπει να προσαρμόζουμε τη συμπεριφορά των κλάσεων και των υποκλάσεων ανάλογα με το πώς θέλουμε να λειτουργήσουν, επιτρέποντας στον κώδικα να είναι πιο ευέλικτος και επαναχρησιμοποιήσιμος. Επίσης, αυτό μας επιτρέπει να γράφουμε κώδικα που μπορεί να δουλέψει με διάφορα αντικείμενα τύπου, ανεξάρτητα από την εσωτερική υλοποίησή τους, αρκεί να παρέχουν την ίδια διεπαφή (όπως οι μέθοδοι με το ίδιο όνομα).

Αυτή η ευελιξία και η ανεξαρτησία του κώδικα από τις εσωτερικές λεπτομέρειες των κλάσεων και των υποκλάσεων είναι μια από τις βασικές αρχές του αντικειμενοστραφούς προγραμματισμού και κάνει τον κώδικα πιο εύκολο στη συντήρηση και την επέκταση.

7 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων