επιτρέπει σε μια κλάση ( ή ) να επαναχρησιμοποιεί και να επεκτείνει τα πεδία και τις μεθόδους μιας άλλης κλάσης ( ή ). Μοντελοποιεί μια σχέση : ένα .
επιτρέπει σε μια κλάση ( ή ) να επαναχρησιμοποιεί και να επεκτείνει τα πεδία και τις μεθόδους μιας άλλης κλάσης ( ή ). Μοντελοποιεί μια σχέση : ένα .
DogAnimalclass Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog inherits everything from Animal
def bark(self): # ...and adds new behavior
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → inherited, not rewritten
print(d.bark()) # "Woof!" → Dog-specific
Το Dog πήρε __init__ και eat δωρεάν και πρόσθεσε bark. Μια υποκλάση μπορεί επίσης να παρακάμπτει τις κληρονομημένες μεθόδους για να αλλάξει τη συμπεριφορά.
| Πλεονέκτημα | Κίνδυνος |
|---|---|
| Επαναχρησιμοποίηση κοινού κώδικα | Στενή σύζευξη με τη γονική κλάση |
| Μοντελοποίηση πραγματικών ιεραρχιών | Εύθραυστη βασική κλάση — αλλαγές γονέα σπάνε παιδιά |
| Πολυμορφισμός μέσω ενός κοινού τύπου | Βαθιά δέντρα γίνονται δύσκολο να παρακολουθούνται |
Ένας κοινός κανόνας: να προτιμάτε τη σύνθεση έναντι της κληρονομικότητας όταν η σχέση είναι πραγματικά "has-a", όχι "is-a".
Η κληρονομικότητα είναι η πιο κακοχρησιμοποιημένη λειτουργία OOP: είναι δελεαστικό να τη χρησιμοποιείτε απλώς για να μοιράζεστε κώδικα, το οποίο συζεύγνυει άσχετες κλάσεις.
Όταν χρησιμοποιείται σωστά — μόνο για γνήσιες σχέσεις is-a — σας δίνει επαναχρησιμοποίηση συν πολυμορφισμό, επιτρέποντάς σας να αντιμετωπίζετε πολλούς υπότυπους ομοιόμορφα μέσω της κοινής τους γονικής κλάσης.