PHP objects and public/private methods

Giorgos Keramidas keramida at ceid.upatras.gr
Tue Sep 4 18:53:16 EEST 2007


On 2007-09-04 18:42, Theodore Lytras <thlytras at gmail.com> wrote:
>Στις Τρίτη 04 Σεπτέμβριος 2007 16:59, ο/η Giorgos Keramidas έγραψε:
>>     * object interface
>>
>>     * public/protected methods/data
>>
>> Δύο unrelated objects μπορούν άνετα να στέλνουν "messages" το ένα στο
>> άλλο, μέσω ενός καλά ορισμένου "interface".
>
> Έψαξα λίγο την έννοια του interface ανατρέχοντας στη wikipedia και
> στην τεκμηρίωση της PHP[1] αλλά να πω την αλήθεια δεν μπόρεσα να
> πολυκαταλάβω ποιά η πρακτική χρησιμότητα του πράγματος αυτού. Δηλαδή
> ουσιαστικά δεσμεύεις τις κλάσεις σου να έχουν συγκεκριμένες μεθόδους.
> Ποιός ο λόγος να το κάνεις αυτό? Απλώς για να δείχνει όμορφος ο
> κώδικας? (Συγνώμη αν ακούγονται αφελή αυτά, αλλά όπως είπα πριν είμαι
> ερασιτέχνης στον προγραμματισμό).
> [1] http://de.php.net/manual/en/language.oop5.interfaces.php
>
> Επίσης δε καταλαβαίνω ποιά η διαφορά ενός object interface από μια
> abstract class[2], εκτός του οτι η abstract class αφορά μόνο απογόνους
> της και όχι άσχετες κλάσεις, και οτι μια κλάση δεν μπορεί να
> κληρονομεί από 2 abstract classes (απ'όσο θυμάμαι δεν έχουμε πολλαπλή
> κληρονομικότητα στην PHP). Υπάρχει κάτι άλλο?
> [2] http://www.php.net/manual/en/language.oop5.abstract.php

Ακριβώς επειδή δεν είσαι αναγκασμένος να κληρονομήσεις μια ΠΛΗΡΗ parent
class, αλλά μπορείς πολύ απλά να "υλοποιήσεις" ένα "interface", υπάρχουν
ορισμένες εφαρμογές στις οποίες είναι προτιμότερη η χρήση των δεύτερων.

Η κληρονομικότητα είναι λίγο πιο "βαρύς" τρόπος να πεις ότι υπάρχει
σχέση μεταξύ δύο αντικειμένων.

Η διαφορά μεταξύ κληρονομικότητας και interfaces είναι πολύ πιο εύκολη
αν χρησιμοποιήσεις ένα απλό παράδειγμα:

    Εγώ έχω "κληρονομήσει" πολλά χαρακτηριστικά του πατέρα μου.
    Μαζί με αυτά έχω κληρονομήσει και τα απαραίτητα για να "υλοποιήσω"
    το interface "δίποδο ον, το οποίο περπατάει όρθιο".

    Το ίδιο "interface" του "δίποδου όντος το οποίο περπατάει όρθιο"
    υλοποιεί και ένας Κινέζος σχεδιαστής καλλιγραφικών Mandarin
    ιδεογραμμάτων.

    Ενας τρίτος, ο οποίος σχεδιάζει σκάλες, δε χρειάζεται να ξέρει
    επακριβώς το μήκος των ποδιών μου, ή πόσα δάχτυλα έχει ο Κινέζος
    καλλιγράφος.  Για να σχεδιάσει τη σκάλα του Δημαρχείου στο San
    Francisco, αρκεί να ξέρει το "interface" με το οποίο τα δίποδα
    όντα πρόκειται να χρησιμοποιήσουν το αντικείμενο που σχεδιάζει.

Για άλλες εφαρμογές, ίσως είναι πιο χρήσιμη η κληρονομικότητα.  Π.χ.
ο σχεδιαστής αντικειμένων ιατρικής διάγνωσης, ίσως θέλει να ξέρει
ποιό είναι το parent class μου, για να τον βοηθήσει στη διάγνωση μιας
ασθένειας που "χτυπάει" λευκούς, Καυκασιανούς με μελαχρινό δέρμα,
αλλά δεν μπορεί να προσβάλλει Ασιάτες.

Και τα δύο (κληρονομικότητα, interfaces) έχουν τις χρήσεις τους :-)

> Νομίζω παρέλειψα την πιο κρίσιμη λεπτομέρεια του προβλήματος: ο
> χρήστης δεν θέλω να απασχολείται με το interface των MyElement
> objects, ούτε των ενδιάμεσων container objects, παρά μόνο του αρχικού
> container object. Για να το πω σωστά, το "κυρίως" πρόγραμμα θα πρέπει
> να καλεί τις μεθόδους μόνο της ρίζας της δενδροειδούς δομής. Ούτε των
> διακλαδώσεων, ούτε των φύλλων. Ο χρήστης βλέπει μόνο το δέντρο, όχι τα
> κλαδιά και τα φύλλα του.

Ο χρήστης τότε αρκεί να ξέρει ότι τα αντικείμενα του "collection X"
υλοποιούν πάντα το "interface Z".  Αλλιώς, κάτι δεν έχεις σχεδιάσει
πολύ καλά και χρειάζεται λίγο ζωγραφική ακόμα :)




More information about the Linux-greek-users mailing list