Κυριακή 21 Ιουνίου 2020

Αναθεώρηση 31, Έκδοση 9.9 Ιεραρχία Κλάσεων

Σε αυτήν την αναθεώρηση έκανα μια απλή σκέψη, αν μπορούσα να συνδυάσω ορισμούς κλάσεων για να φτιάξω μια νέα κλάση, εντί του να συνδυάζω αντικείμενα για να βγάλουν νέα αντικείμενα.

Έχω ενημερώσει και τα δυο εγχειρίδια για τις προσθήκες.

Προσθήκη 1
Τελεστής Με (With) για ομάδες (αντικείμενα) όπου κάνουμε το συνδυασμό ομάδων πριν την τελική εκχώρηση.

Δουλεύει όπως και στους τελεστές για ομάδες με τη διαφορά ότι έχουμε στο τελικό αποτέλεσμα το συνδυασμό των ομάδων. 

Ένα πολύ απλό παράδειγμα, όπου έχουμε μια κλάση Άλφα με μια μεταβλητή1 (εκεί κρατάει τη κατάσταση), θέλουμε να προσθέσουμε έναν καταστροφέα (deconstructor) που απλά θα μας ειδοποιεί για τη καταστροφή, και αυτό μπορεί να γίνει με χρήση μιας άλλης κλάσης. Ο συνδυασμός ομάδων έγινε στην δεξιά έκφραση. Το Μ είναι δείκτης σε ομάδα.

Κλάση Αλφα {
     μεταβλητή1=1000
}
Κλάση Καταστροφέας {
    Διαγραφή {
        Τύπωσε "Διαγράφτηκε"
   }
}
Μ->(Αλφα() Με Καταστροφέας())
Μ->0& ' εδώ δίνουμε το Null (δεν μπαίνει μηδέν αλλά μια κενή ομάδα)

Προσθήκη 2
Μπορούμε πια να συνδυάζουμε κλάσεις μεταξύ τους, σε επίπεδο ορισμών. Αυτό το κάνει αυτόματα ο διερμηνευτής:

Θέλουμε να φτιάξουμε μια ρουτίνα που να διαχειρίζεται (να χρησιμοποιεί) αντικείμενα Κατοικίδιο. Έχουμε το βασικό αντικείμενο Ζώο, και πάνω σε αυτό φτιάχνουμε το Κατοικίδιο, και πάνω στο Κατοικίδιο άλλα τρία, το Σκύλος, Γάτα και Πουλί. Στη ρουτίνα θα περάσουμε ένα αντικείμενο από τα Σκύλος, Γάτα, Πουλί και Κατοικίδιο. Παρακάτω είναι η αναφορά που στέλνει το πρόγραμμα στο πρόχειρο (την εμφανίζει και στην οθόνη).

Για το σκοπό του παραδείγματος, θα χρησιμοποιήσουμε ιδιωτικά μέλη, συναρτήσεις που επιστρέφουν τιμές από τα ιδιωτικά μέλη, και σε μερικά θα βάλουμε και κατασκευαστή (τμήμα με ίδιο όνομα με τη κλάση). Τους κατασκευαστές επειδή δεν τους θέλουμε στο τελικό αντικείμενο (συνήθως), τους έχουμε κάτω από ετικέτα Κλάση: που ότι βάζουμε δεν πάνε στο τελικό αντικείμενο (πρόσκαιρα δουλεύουν πριν την όποια αντιγραφή, και εδώ η Κλάση φτιάχνει το αντικείμενο (επώνυμο, οπότε ο όποιος καταστροφέας Διαγραφή δεν εκτελείται αυτόματα) εκκινεί το κατασκευαστή δίνοντας τις παραμέτρους που δώσαμε στη κλήση και στο τέλος επιστρέφει ένα αντίγραφο)
Τελική Αναφορά
Με φωνάζουν Αζόρ και είμαι σκύλος και είμαι κατοικίδιο με 4 πόδια και όλη μέρα γαβγίζω
Με φωνάζουν Ψιψίνα και είμαι γάτα και είμαι κατοικίδιο με 4 πόδια και όλη μέρα νιαουρίζω
Με φωνάζουν Φλοξ και είμαι καναρίνι με 2 πόδια και φτερά και όλη μέρα κελαηδάω
Με φωνάζουν Ντορή και είμαι κατοικίδιο με 4 πόδια και όλη μέρα χλιμιντρίζω
Ορισμένα μέλη τα έχουμε τελικά. Όσα δεν είναι τελικά μπορούν να αλλάξουν τιμή/ορισμό. Απουσιάζει το Αυτό, αλλά εννοείται όπου το όνομα ξεκινάει με μια τελεία, μέσα σε τμήματα και συναρτήσεις αντικειμένων. Για να εκχωρήσουμε τιμή άμεσα έχουμε το <=, αλλιώς το = φτιάχνει τοπική που σκιάζει και το μέλος.

Το έγγραφο ΌλαΜαζι$ στην εκχώρηση προσθέτει κείμενο. Τα μπλοκ {} χρησιμοποιούνται και για αλφαριθμητικά πολλαπλών γραμμών. Ο χρωματιστής της Μ2000 ξεχωρίζει πότε έχουμε κώδικα και πότε αλφαριθμητικό αυτόματα. Από το διάστημα αριστερά της αγκύλης τέλους παίρνει το μέτρο ο διερμηνευτής και αφαιρεί όλα τα διαστήματα/στηλοθέτες ίσου μήκους από αριστερά. Έτσι στην ρουτίνα απλά προσθέτουμε μια αλλαγή γραμμής

Οι ρουτίνες διαφέρουν από τα τμήματα επειδή δεν έχουν δικό τους όνομα χώρου, αλλά αυτόν του τμήματος ή της συνάρτησης που ανήκουν. Οπότε ό,τι έχει το τμήμα είναι θεατά στις ρουτίνες του. Δεν συμβαίνει αυτό στα τμήματα και τις ρουτίνες που περιέχονται σε αυτό.Τα μέλη των αντικειμένων, τμήματα και συναρτήσεις έχουν θέαση μόνο στις δικές τους μεταβλητές σε όσες είναι γενικές και στα μέλη της ομάδας που ανήκουν. Ένα τμήμα μέλος αντικείμενου (μέθοδος δηλαδή) δεν μπορεί να δει ή και να αλλάξει τοπικές άλλων τμημάτων (εντός ή εκτός αντικειμένου). Οι τοπικές είναι "αυτόματες" με την έννοια ότι δημιουργούνται στην κλήση και διαγράφονται μετά. Ότι έχουμε γράψει παρακάτω θα είναι σε ένα τμήμα που στο τέλος του θα τα διαγράψει.

Κλάση Ζώο {
Ιδιωτικό:
      πόδια=0
      ήχος$="τίποτα"
Δημόσιο:
      Συνάρτηση Τελική ΠόσαΠόδια() {
            =.πόδια
      }
      Συνάρτηση ΚάνωΉχο$() {
            =.ήχος$
      }
}
Κλάση Κατοικίδιο ως Ζώο {
Ιδιωτικό:
      όνομα$
      Μήνυμα$="Με φωνάζουν {0} και είμαι κατοικίδιο με {1} πόδια και όλη μέρα {2}"      
Δημόσιο:
      Συνάρτηση Μήνυμα$() {
            =.Μήνυμα$
      }
      Συνάρτηση ΜεΦωνάζουν$() {
            =.όνομα$
      }
Κλάση:
      Τμήμα Κατοικίδιο {
            Διάβασε .όνομα$, .ήχος$, .πόδια
      }
}
Κλάση Σκύλος ως Κατοικίδιο {
      Συνάρτηση ΜεΦωνάζουν$() {
            =.όνομα$+" και είμαι σκύλος"
      }
Κλάση:
      Τμήμα Σκύλος(.Όνομα$) {
            .πόδια<=4
            .ήχος$<="γαβγίζω"
      }
}
Κλάση Γάτα ως Κατοικίδιο {
      Συνάρτηση ΜεΦωνάζουν$() {
            =.όνομα$+" και είμαι γάτα"
      }
Κλάση:
      Τμήμα Γάτα(.Όνομα$) {
            .πόδια<=4
            .ήχος$<="νιαουρίζω"
      }
}
Κλάση Πουλί ως Κατοικίδιο {
Ιδιωτικό:
      τύπος$="κάτι"
      Μήνυμα$="Με φωνάζουν {0} με {1} πόδια και φτερά και όλη μέρα {2}"
Δημόσιο:
      Συνάρτηση ΜεΦωνάζουν$() {
            =.όνομα$+" και είμαι "+.τύπος$
      }
Κλάση:
      Τμήμα Πουλί(.Όνομα$, .τύπος$) {
            .πόδια<=2
            .ήχος$<="κελαηδάω"
      }
}
Εγγραφο ΌλαΜαζι$={Τελική Αναφορά
}
Αζορ=Σκύλος("Αζόρ")
Τι(Αζορ)
Ψιψίνα=Γάτα("Ψιψίνα")
Τι(Ψιψίνα)
Φλοξ=Πουλί("Φλοξ", "καναρίνι")
Τι(Φλοξ)
ΆλλοΚατοικίδιο=Κατοικίδιο("Ντορή", "χλιμιντρίζω", 4)
Τι(ΆλλοΚατοικίδιο)
\\ στέλνουμε στο πρόχειρο την αναφορά
Πρόχειρο ΌλαΜαζι$


Τέλος
\\ Η ρουτίνα δέχεται οτιδήποτε είναι κατοικίδιο
\\ έτσι δέχεται Κατοικίδιο, Γάτα, Σκύλος, Πουλί
Ρουτίνα Τι(Α ως Κατοικίδιο)
      Τοπική Εξ$=Μορφή$(Α.Μήνυμα$(),Α.ΜεΦωνάζουν$(), Α.ΠόσαΠόδια(), Α.ΚάνωΉχο$())
      ΌλαΜαζι$=Εξ$+{
      }
      Αναφορά Εξ$
Τέλος Ρουτίνας



Προσθήκη 3
Η τελευταία προσθήκη ολοκληρώνει το σύστημα αντικειμένων τύπου Ομάδα. Αν θέλουμε να περιορίσουμε την συγχώνευση στα στοιχεία που ήδη έχει ένα αντικείμενο, βάζουμε μια Θέσε {Διάβασε Αυτό}. Η Διάβασε Αυτό μέσα σε κατασκευαστή κατά τη κλήση της κλάσης λειτουργεί όπως και πριν δηλαδή επιτρέπει την επαύξηση, όπως το Με κάνει στην περίπτωση 1

Κλάση Αλφα {
      Χ=10
      Θέσε {
            Διάβασε Αυτό
      }
}
Κλάση Βήτα ως Αλφα {
      Ζ=0
Κλάση:
      Τμήμα Βήτα (, ) {
      }
}
Κ=Αλφα()
Τύπωσε Κ.Χ=10
Μ=Βήτα(100, 300)
Κ=Μ
Τύπωσε Κ.Χ=300
\\ αν σβήσουμε τη Θέσε {} από την Αλφα
\\ το αμέσως επόμενο είναι δίνει Ψευδές,
\\ γιατί η Κ θα πάρει ένα μέλος Ζ
Τύπωσε Έγκυρο(@Κ ως Μ)=Ψευδές
Τύπωσε Έγκυρο(@Μ ως Κ)=Αληθές

Το παραπάνω πρόγραμμα μπορεί να γραφτεί με συνδυασμό σε επίπεδο αντικειμένων. Εδώ έχουμε κατασκευαστές για καθένα αντικείμενο, Υποτίθεται ότι είναι ανεξάρτητα.
Επειδή το Χ στο Αλφα έχει ήδη τιμή, ακόμα και δεν δώσουμε τιμή στον κατασκευαστή θα το προσπεράσει η Διάβασε. (αν όμως δεν είχε τιμή τότε θα έβγαινε λάθος). Το ερωτηματικό στο Αλφα(?) μπορεί να βγει. Εδώ μπήκε για να θυμίζει ότι δεν δώσαμε τιμή αλλά το "μείνε με ότι έχεις". Επειδή το τμήμα Αλφα (.Χ) {} το οποίο πράγματι είναι το Αλφα {Διάβασε .Χ} παίρνει το σωρό τιμών της συνάρτησης Αλφα() δεν έχουμε θέμα αν θα υπήρχε κάτι από προηγούμενη χρήση.  Τα τμήματα δέχονται το σωρό τιμών αυτού που το καλεί και μπορεί να αφήσει πράγματα όχι μόνο να πάρει. Το ίδο γίνεται και με τις ρουτίνες.

Κλάση Αλφα {
      Χ=10
      Θέσε {
            Διάβασε Αυτό
      }
Κλάση:
      Τμήμα Αλφα () {
      }
}
Κλάση Βήτα {
      Ζ=0
Κλάση:
      Τμήμα Βήτα () {
      }
}
Κ=Αλφα(?)
Τύπωσε Κ.Χ=10
Μ=Βήτα(100) με Αλφα(300)
Κ=Μ
Τύπωσε Κ.Χ=300
\\ αν σβήσουμε τη Θέσε {} από την Αλφα
\\ το αμέσως επόμενο είναι δίνει Ψευδές,
\\ γιατί η Κ θα πάρει ένα μέλος Ζ
Τύπωσε Έγκυρο(@Κ ως Μ)=Ψευδές
Τύπωσε Έγκυρο(@Μ ως Κ)=Αληθές

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.