Μαθήματα μπορεί να κληρονομήσει χαρακτηριστικά από τις μητρικές τάξεις τους. Αλλά μερικές φορές θέλετε ένα χαρακτηριστικό να είναι σε θέση να κληρονομήσουν την αξία του από το γονικό αντικείμενο. Για παράδειγμα, αυτό είναι το πώς λειτουργούν στυλ CSS σε HTML.
MooseX :: AttributeTree είναι ένα Perl ενότητα που σας επιτρέπει να εφαρμόσετε το χαρακτηριστικό TreeInherit σε οποιαδήποτε ιδιότητα στην τάξη σας & nbsp?. Αυτό αλλάζει τον τρόπο μέθοδος accessor του χαρακτηριστικού λειτουργεί. Κατά την ανάγνωση τιμή του χαρακτηριστικού, εάν δεν έχει οριστεί τιμή για το γνώρισμα σε αυτό το αντικείμενο, η accessor θα επιστρέψει την τιμή από το γονικό αντικείμενο (το οποίο θα μπορούσε επίσης να κληρονομήσει).
Το γονικό αντικείμενο δεν πρέπει να είναι του ίδιου τύπου με το αντικείμενο του παιδιού, αλλά πρέπει να έχει μια μέθοδο με το ίδιο όνομα με τη μέθοδο accessor του χαρακτηριστικού (εκτός αν σας προμηθεύσει ένα fetch_method). (Μέθοδος του γονέα μπορεί να είναι μια μέθοδος χαρακτηριστικό στοιχείο πρόσβασης, αλλά δεν πρέπει να είναι.) Αν ο γονέας δεν έχει τη σωστή μέθοδο, θα πάρετε ένα σφάλμα χρόνου εκτέλεσης, εάν το παιδί προσπαθεί να την αποκαλούμε.
Από προεπιλογή, MooseX :: AttributeTree αναμένει να πάρει το γονικό αντικείμενο καλώντας μητρική μέθοδος του αντικειμένου. Ωστόσο, μπορείτε να χρησιμοποιήσετε οποιαδήποτε μέθοδο για να ανακτήσει τη σύνδεση με το πέρασμα του κατάλληλου parent_link στο χαρακτηριστικό TreeInherit:
& Nbsp? Έχει πρόγονο => (
& Nbsp? Είναι => «rw»,
& Nbsp? ΛΑΣ => «Αντικείμενο»,
& Nbsp? Weak_ref => 1,
& Nbsp?)?
& Nbsp? Έχει αξία => (
& Nbsp? Είναι => «Ro»,
& Nbsp? Γνωρίσματα => [TreeInherit => {parent_link => 'πρόγονο'}],
& Nbsp?)?
Αν η μέθοδος επιστρέφει αδιευκρ, τότε κληρονομιά σταματά και η accessor θα συμπεριφέρεται σαν ένα κανονικό accessor. (Κανονικά, parent_link θα είναι το όνομα μιας μεθόδου χαρακτηριστικό στοιχείο πρόσβασης, αλλά δεν πρέπει να είναι.)
Μερικές φορές δεν είναι βολικό για το γονικό αντικείμενο να έχετε μια ξεχωριστή μέθοδο για κάθε χαρακτηριστικό ότι ένα αντικείμενο το παιδί μπορεί να θέλει να κληρονομήσει. Σε αυτή την περίπτωση, μπορείτε να δώσετε μια fetch_method στο χαρακτηριστικό TreeInherit.
& Nbsp? Έχει other_value => (
& Nbsp? Είναι => «Ro»,
& Nbsp? Γνωρίσματα => [TreeInherit => {fetch_method => 'get_inherited'}],
& Nbsp?)?
Με fetch_method, η κληρονόμησε αξία θα προέλθει από
& Nbsp? $ Αυτο> γονέα> get_inherited («other_value»)?
αντί του συνήθους
& Nbsp? $ Αυτο> γονέα> other_value ()?
Αν χαρακτηριστικό σας έχει μια μέθοδο κατηγόρημα, αναφέρει αν η παράμετρος έχει οριστεί σε αυτό το αντικείμενο. Το κατηγόρημα δεν έχει καμία γνώση οποιασδήποτε αξίας που μπορεί να κληρονομείται από έναν γονέα. Αυτό σημαίνει ότι $ αντικειμένου-> has_value μπορεί να επιστρέψει false, ακόμη και αν $ αντικειμένου-> αξία θα επιστρέψει μια τιμή (κληρονομείται από τη μητρική).
Ομοίως, σαφέστερη τη μέθοδο του χαρακτηριστικού (αν υπάρχει) θα καθαρίσει το χαρακτηριστικό μόνο σε αυτό το αντικείμενο, και ποτέ δεν θα μπορούσε να επηρεάσει ένα γονικό αντικείμενο.
ΣΥΝΟΨΗ
& Nbsp? Πακέτο MyClass?
& Nbsp? Χρησιμοποιήσετε Moose?
& Nbsp? Χρησιμοποιήσετε MooseX :: AttributeTree ()?
& Nbsp? Έχει γονέας => (
& Nbsp? Είναι => «rw»,
& Nbsp? ΛΑΣ => «Αντικείμενο»,
& Nbsp? Weak_ref => 1,
& Nbsp?)?
& Nbsp? Έχει αξία => (
& Nbsp? Είναι => «rw»,
& Nbsp? Γνωρίσματα => [QW / TreeInherit /],
& Nbsp?)?
Απαιτήσεις :
- Perl
Τα σχόλια δεν βρέθηκε