Μπορείς να μιλήσεις για τις αρχές της κληρονομικότητας στον αντικειμενοστραφή προγραμματισμό;
sobes.tech AI
Απάντηση από AI
Η κληρονομικότητα επιτρέπει τη δημιουργία μιας νέας κλάσης (υποκλάση ή παράγωγη), βασισμένης σε μια υπάρχουσα κλάση (γονέα, βασική ή υπερκλάση). Η υποκλάση κληρονομεί ιδιότητες (attributes) και μεθόδους της γονικής κλάσης, και μπορεί επίσης να προσθέσει τις δικές της ή να υπερισχύσει τις κληρονομημένες.
Βασικές έννοιες:
- Επέκταση λειτουργικότητας: Με την κληρονομικότητα από την γονική κλάση, η υποκλάση λαμβάνει βασική λειτουργικότητα και μπορεί να την επεκτείνει προσθέτοντας νέες μεθόδους ή ιδιότητες.
- Υπερισχύσεις μεθόδων: Η υποκλάση μπορεί να αλλάξει τη συμπεριφορά μιας κληρονομημένης μεθόδου από την γονική κλάση δημιουργώντας μια μέθοδο με το ίδιο όνομα (πολυμορφισμός).
- Επανάχρηση κώδικα: Αποφεύγει την διπλή καταγραφή κώδικα, καθώς η κοινή λογική ορίζεται στην γονική κλάση.
- Σχέση "είναι": Η κληρονομικότητα μοντελοποιεί τη σχέση "είναι" (is-a). Για παράδειγμα, "Ένας γάτος είναι ένα ζώο".
<?php
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "Άγνωστος ήχος\n";
}
}
class Dog extends Animal {
public function speak() {
echo "Γαβ-γαβ!\n";
}
}
class Cat extends Animal {
public function speak() {
echo "Μιαου-μιαου!\n";
}
}
$dog = new Dog("Bobby");
$dog->speak(); // Έξοδος: Γαβ-γαβ!
$cat = new Cat("Murka");
$cat->speak(); // Έξοδος: Μιαου-μιαου!
?>
Στα PHP, η κληρονομικότητα υλοποιείται με τη λέξη-κλειδί extends. Μια κλάση μπορεί να κληρονομήσει μόνο από μια κλάση (μονογονεϊκή κληρονομικότητα), αλλά μπορεί να υλοποιεί πολλαπλά interfaces.
Η πρόσβαση σε ιδιότητες και μεθόδους της γονικής κλάσης από την υποκλάση είναι δυνατή με τη χρήση της λέξης-κλειδί parent::.
<?php
class ParentClass {
protected $value = "τιμή γονέα";
public function showValue() {
echo $this->value . "\n";
}
}
class ChildClass extends ParentClass {
// Υπερκαλύπτει την ιδιότητα
protected $value = "τιμή παιδιού";
public function showValues() {
// Κλήση της μεθόδου της γονικής κλάσης
parent::showValue();
// Εμφάνιση της τιμής της υποκλάσης
echo $this->value . "\n";
}
}
$obj = new ChildClass();
$obj->showValues();
// Έξοδος:
// τιμή γονέα
// τιμή παιδιού
?>
Βασικοί τροποποιητές πρόσβασης:
public: Διαθέσιμο παντού.protected: Διαθέσιμο μέσα στην κλάση και στις κλάσεις που την κληρονομούν.private: Διαθέσιμο μόνο μέσα στην κλάση.
Οι μέθοδοι μπορούν να δηλωθούν final, που απαγορεύει την υπερισχύση τους σε υποκλάσεις. Οι κλάσεις μπορούν επίσης να είναι final, που απαγορεύει την κληρονομία τους. Μπορούν να είναι abstract, που απαιτεί την υλοποίησή τους σε υποκλάσεις.