Κληρονομία από κλάση και υλοποίηση διεπαφής στην αντικειμενοστρεφή προγραμματισμό στην PHP
Μια κλάση μπορεί να κληρονομήσει από μια άλλη κλάση και ταυτόχρονα να υλοποιεί κάποια διεπαφή. Ας το εξετάσουμε με ένα πρακτικό παράδειγμα.
Ας υποθέσουμε ότι θέλουμε να δημιουργήσουμε μια κλάση Programmer,
η οποία θα έχει όνομα, μισθό και μια λίστα με γλώσσες
που γνωρίζει ο προγραμματιστής.
Προς το παρόν η περιγραφή της κλάσης μας είναι αρκετά αόριστη:
ναι, στην κλάση θα υπάρχει όνομα, μισθός, γλώσσες -
αλλά ποιες μέθοδοι θα έχει η κλάση μας;
Ας περιγράψουμε πιο ακριβώς την κλάση μας χρησιμοποιώντας
τη διεπαφή iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Ας υποθέσουμε ότι ψάξαμε στις ήδη υλοποιημένες
κλάσεις μας και, αποδεικνύεται, ότι έχουμε ήδη μια παρόμοια
κλάση Employee. Δεν υλοποιεί όλες
τις μεθόδους της κλάσης Programmer, αλλά μερικές.
Αυτός είναι ο κώδικας της κλάσης που έχουμε ήδη:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Είναι λογικό στην περίπτωσή μας να κάνουμε έτσι ώστε
η νέα μας κλάση Programmer να κληρονομήσει
μέρος των απαραίτητων μεθόδων από την κλάση
Employee (και το υπόλοιπο μέρος θα το υλοποιήσουμε
αργότερα στην ίδια τη νέα κλάση):
<?php
class Programmer extends Employee
{
}
?>
Ταυτόχρονα, γνωρίζουμε ότι η κλάση Pogrammer
πρέπει να υλοποιεί τη διεπαφή
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Ας συνδυάσουμε την κληρονομιά από την κλάση
Employee και την υλοποίηση της διεπαφής
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Θα προκύψει ότι η κλάση μας Pogrammer
θα κληρονομήσει από την κλάση Employee τις μεθόδους
__construct, getName και getSalary,
ενώ τις μεθόδους addLang και getLangs
θα πρέπει να υλοποιήσουμε εμείς:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// υλοποίηση
}
public function getLangs()
{
// υλοποίηση
}
}
?>
Στη διεπαφή iProgrammer δεν έχει σημασία
αν οι μέθοδοι είναι εγγενείς στην κλάση ή κληρονομημένες
- το κύριο πράγμα είναι ότι όλες οι περιγραφείσες μέθοδοι πρέπει να είναι
υλοποιημένες.
Αντιγράψτε τον κώδικα της κλάσης μου Employee
και τον κώδικα της διεπαφής iProgrammer. Μην αντιγράψετε
το προσχέδιο μου για την κλάση Programmer -
χωρίς να κοιτάτε τον κώδικά μου υλοποιήστε αυτήν την
κλάση μόνοι σας.