Αφηρημένες Κλάσεις στην αντικειμενοστρεφή προγραμματισμό στην PHP
Ας υποθέσουμε ότι έχετε μια κλάση User, και
από αυτήν κληρονομούν οι κλάσεις Employee και
Student.
Σε αυτή την περίπτωση, υποτίθεται ότι θα δημιουργείτε
αντικείμενα των κλάσεων Employee και Student,
αλλά αντικείμενα της κλάσης User - δεν θα δημιουργείτε,
καθώς αυτή η κλάση χρησιμοποιείται μόνο για την
ομαδοποίηση κοινών ιδιοτήτων και μεθόδων των
κληρονόμων της.
Σε αυτή την περίπτωση, μπορείτε να απαγορεύσετε υποχρεωτικά
τη δημιουργία αντικειμένων της κλάσης User, ώστε
εσείς ή ένας άλλος προγραμματιστής πουθενά κατά λάθος
να μην τα δημιουργήσετε.
Για αυτό υπάρχουν οι λεγόμενες αφηρημένες κλάσεις. Οι αφηρημένες κλάσεις αντιπροσωπεύουν κλάσεις που προορίζονται για κληρονομικότητα από αυτές. Ταυτόχρονα, δεν μπορούν να δημιουργηθούν αντικείμενα τέτοιων κλάσεων.
Για να δηλώσετε μια κλάση ως αφηρημένη,
πρέπει κατά τη δήλωσή της να γράψετε τη λέξη-κλειδί
abstract:
<?php
abstract class User
{
}
?>
Λοιπόν, ας γράψουμε την υλοποίηση της αφηρημένης
κλάσης User. Ας έχει μια ιδιωτική
ιδιότητα name, καθώς και getters και setters
για αυτήν:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
?>
Η προσπάθεια δημιουργίας αντικειμένου της κλάσης User
θα προκαλέσει σφάλμα:
<?php
$user = new User; // θα εμφανίσει σφάλμα
?>
Ωστόσο, θα είναι δυνατή η κληρονομικότητα από την κλάση μας.
Ας φτιάξουμε την κλάση Employee, η οποία
θα κληρονομεί από την αφηρημένη μας
κλάση User:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
}
?>
Ας δημιουργήσουμε ένα αντικείμενο της κλάσης Employee -
όλα θα λειτουργούν:
<?php
$employee = new Employee;
$employee->setName('john'); // μέθοδος γονέα, δηλαδή της κλάσης User
$employee->setSalary(1000); // δική της μέθοδος, δηλαδή της κλάσης Employee
echo $employee->getName(); // θα εμφανίσει 'john'
echo $employee->getSalary(); // θα εμφανίσει 1000
?>
Δημιουργήστε μια αφηρημένη κλάση Figure,
που αντιπροσωπεύει ένα γεωμετρικό
σχήμα. Ας κληρονομήσουν από αυτήν κλάσεις
για κύκλο, ορθογώνιο και τετράγωνο.