Πολλαπλές Διεπαφές στην ΑΝΠ στη PHP
Στη PHP δεν υπάρχει πολλαπλή κληρονομικότητα - κάθε
κλάση μπορεί να έχει μόνο ένα γονέα.
Με τις διεπαφές, ωστόσο, τα πράγματα είναι διαφορετικά:
κάθε κλάση μπορεί να υλοποιήσει οποιονδήποτε αριθμό
διεπαφών. Για να γίνει αυτό, τα ονόματα των διεπαφών
πρέπει να αναγραφούν χωρισμένα με κόμματα μετά από την λέξη-κλειδί
implements.
Αυτή είναι ακόμη μια διαφορά των διεπαφών από τις αφηρημένες κλάσεις - μπορούμε να υλοποιήσουμε πολλές διεπαφές, αλλά δεν μπορούμε να κληρονομήσουμε πολλές αφηρημένες κλάσεις.
Ας δοκιμάσουμε στην πράξη. Ας υποθέσουμε ότι εκτός από
τη διεπαφή iFigure έχουμε επίσης τη
διεπαφή iTetragon.
Οι μέθοδοι αυτής της διεπαφής θα υλοποιηθούν από
τις κλάσεις Quadrate και Rectangle,
αφού έχουν 4 πλευρές, αλλά όχι από την κλάση
Disk.
Ας υποθέσουμε ότι η διεπαφή iTetragon περιγράφει
μεθόδους λήψης (getters) και για τις τέσσερις πλευρές
ενός τετραπλεύρου:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Ας υποθέσουμε επίσης ότι έχουμε τη διεπαφή iFigure,
την οποία δημιουργήσαμε νωρίτερα:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Ας κάνουμε την κλάση Quadrate να
υλοποιεί δύο διεπαφές. Για να το κάνουμε αυτό, ας απαριθμήσουμε
και τις δύο διεπαφές χωρισμένες με κόμμα μετά από τη λέξη-κλειδί
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// εδώ θα υλοποιηθεί ο κώδικας
}
?>
Ας τροποποιήσουμε τώρα την κλάση Quadrate,
ώστε να υλοποιεί τη διεπαφή iTetragon.
Είναι σαφές ότι το τετράγωνό μας είναι μια εκφυλισμένη
περίπτωση τετραπλεύρου, αφού στο τετράγωνο
όλες οι πλευρές είναι ίσες. Επομένως, όλες οι νέες μέθοδοι
θα επιστρέφουν το ίδιο πράγμα - το πλάτος του τετραγώνου:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Είναι προφανές ότι σε ένα ορθογώνιο δεν είναι όλες
οι πλευρές ίδιες, αλλά μόνο οι απέναντι.
Σε αυτή την περίπτωση, οι νέες μέθοδοι θα είναι ελαφρώς
διαφορετικές. Και, σε ένα τραπέζιο,
γενικά και οι 4 πλευρές θα είναι διαφορετικές.
Ωστόσο, δεν έχει σημασία τι σχήμα θα εξετάσουμε - είναι σημαντικό ότι όλα αυτά τα σχήματα θα έχουν τις περιγραφείσες μεθόδους (ακόμα κι αν μερικά σχήματα είναι εκφυλισμένα) και θα λειτουργούν ομοιόμορφα.
Φροντίστε ώστε η κλάση Rectangle
να υλοποιεί επίσης δύο διεπαφές: τόσο την iFigure,
όσο και την iTetragon.
Δημιουργήστε τη διεπαφή iCircle με μεθόδους
getRadius και getDiameter.
Φροντίστε ώστε η κλάση Disk να
υλοποιεί επίσης δύο διεπαφές: τόσο την iFigure,
όσο και την iCircle.