Σάββατο, 14 Οκτωβρίου 2017

Υπερκλάση (Superclass) νέα δυνατότητα για την Μ2000. (edit)

Αναθεώρηση 38 (Έκδοση 8.9) (Διορθώθηκε για την έκδοση 9.0)
Μετά από ωραίες σκέψεις κατάφερα να υλοιποιήσω την δυνατότητα οι ομάδες μεταξύ τους να έχουν ένα δικό τους χώρο για κοινές μεταβλητές. Άλλοι θα το δουν ότι κληρονομούν ιδιότητες και μεθόδους, αλλά αυτό ίσχυε και πριν, επειδή τα βασικά ντικείμενα της Μ2000, οι ομάδες είναι αυτό που λέμε prototyped objects.
Οι ιδιότητες των αντικειμένων της Μ2000, λεγόμενων ομάδων, ως πρωτοτύπων είναι:
  • Μπορούν να δώσουν αντίγραφό τους και έτσι λειτουργούν ως πρωτότυπα. Αυτό που δίνουν είναι ένα αντίγραφο με την τωρινή κατάσταση. Αν το δίνουν σε μια ομάδα, τότε θα έχουμε συγχώνευση στο προορισμό. Όταν δίνουν αντίγραφο σε θέση πίνακα, κατάστασης, ή σε επιστρέφουν τιμή σε σωρό τιμών, τότε δεν έχουμε συγχώνευση, αλλά αντικατάσταση.
  •  Μπορούν να δημιουργούνται, με μέλη, στην πορεία. Η εντολή δημιουργίας, η Ομάδα Όνομα {] μπορεί να δοθεί και άλλες φορές. Αυτό σημαίνει ότι μπορούν να αλλάξουν ορισμούς σε τμήματα και συναρτήσεις.
  • Δεν μπορούμε άμεσα να διαγράψουμε μέλη. Υπάρχει τρόπος να ορίσουμε προσωρινά ένα όνομα ως αναφορά σε μια ομάδα (με όνομα) και να αυξήσουμε αυτήν, οπότε όταν διαγραφεί, θα αφήσει ότι αλλαγές έχει κάνει στην αναφορέμονη ομάδα.
  • Μπορούν να έχουν ή όχι όνομα. Όταν δεν έχουν όνομα βρίσκονται σε θέσεις που προσδιορίζονται με κάποιους δείκτες, όπως σε θέση πίνακα, σε κατάσταση βάσει κλειδιού, σε σωρό τιμών.
  • Μπορούν να έχουμε ομάδες μέσα σε ομάδες. Οι ιδιότητες είναι ομάδες σε ομάδες που γυρνούν τιμές.
  • Μπορούμε να ορίσουμε οποιαδήποτε ομάδα να παίρνει τιμή, ή να δίνει τιμή, ή και τα δύο. Εξ ορισμού δίνει το αντίγραφό της.
  • Μπορούμε να ορίσουμε τελεστές (πράξεις) τόσο ως μοναδιαίες όπως το Α++, όσο και κανονικά, αλλά όταν δεν έχουμε ορίσει αξία (γιατί αν το έχουμε κάνει ισχύουν οι τελεστές που έχει η "αξία"). Έτσι μια έκφραση Α=Β+Γ μπορεί να αποτελείται από τρεις ομάδες όπου η Α φτιάχνεται από την Β και και Γ
  • Σε αυτήν την αναθεώρηση μπήκε και η Υπερκλάση. Έτσι με το μπλοκ Για Υπερκλάση { } μποορύμε να προσεγγίσουμε τις μεταβλητές/πίνακες της υπερκλάσης. Η υπερκλάση ακολουθεί και σε αυτό που αντιγράφουμε την ομάδα μας.
  • Υπήρχαν τρεις διαφορετικές ζώνες στο μπλοκ δημιουργίας των ομάδων, το Ιδιωτικό, Δημόσιο, και η Κλάση. και τώρα προστέθηκε το Μοναδικό. Μπορούμε στις Υπερκλάσεις να ορίσουμε μοναδικά πεδία, ώστε να μην έχουν ένα παρόμοιο τα αντικείμενα που φτιάχνουμε από αυτή, αλλά να βλέπουν αυτά τα κοινά πεδία όλα τα αντικείμενα της υπερκλάσης. Μόνο τα Μοναδικά και τα Δημόσια μπορούμε να τα βλέπουμε ως μέλη της Υπερκλάσης. Όλα εκτός από τα μοναδικά θα υπάρχουν για τα αντικείμενα. Η ζώνη της κλάσης χρησιμοποιείται για προσωρινά στοιχεία, τμήματα, συναρτήσεις, που δεν θέλουμε να μην αντιγράφονται.
  • Η Κλάση Όνομα {} δημιουργεί γενική συνάρτηση που δημιουργεί ομάδες και η ζώνη της κλάσης παραγράφεται από το τελικό προιόν. Μπορούμε με το ίδιο όνομα να δώσουμε ένα τμήμα ως κατασκευαστής. Δεν υπάρχει ειδικός "διαλύτης" ομάδων.
  • Η Υπερκλάση δεν είναι συνάρτηση, αλλά όταν φτιάχνεται δημιουργείται σε μια μεταβλητή ένα αντικείμενο χωρίς μέλη, αλλά με δυο στοιχεία, ένα που λέει ότι είναι υπερκλάση, και ένα άλλο που είναι ο δείκτης στο αντικείμενο. Το αντικείμενο χρησιμοποιείται για να φτιάχνουμε νέα αντικείμενα, και για να σώνουμε τις μεταβλητές/πίνακες της υπερκλάσης. Προς το παρόν δεν υπάρχει κάτι για να δηλώνει αν μια ομάδα έχει μια συγκεκριμένη υπερκλάση. Αυτό μπορεί να γίνει "συμβατικά" δηλαδή να ορίσουμε μια μεταβλητή να κρατάει το όνομα της κλάσης, και να μην την "εμπλουτίζουμε".
  • Οι ομάδες δεν είναι αντικείμενα με δείκτες, δηλαδή δεν τις κρατάμε σε ενέργεια με δείκτες (αναφορές) σε αυτές. Οι επώνυμες ομάδες διαγράφονται στο μπλοκ που δημιουργήθηκαν (τμήμα ή μπλοκ Για αντικείμενο { }), ενώ οι ανώνυμες διαγράφονται όταν διαγραφεί ο φορέας τους (πχ ο Πίνακας). Μπορούμε να χρησιμοποιούμε πίνακες που είναι αντικείμενα με δείκτες και να φτιάξουμε ολόκληρη δομή συνδεδεμένων ομάδων. Οι πίνακες μπορούν να έχουν πίνακες, καταστάσεις, σωρούς, ομάδες, λάμδα συναρτήσεις,και φυσικά τιμές που δεν είναι αντικείμενα. 
  • Δεν γίνεται μια ομάδα να δείχνει τον εαυτό της με δέικτη. Μπορούμε να χρησιμοποιήσουμε την Αυτό (This) για να την περάσουμε με αναφορά ή με αντιγραφή  την ομάδα μέσα από ένα τμήμα της ομάδας, ή μια συνάρτηση.
  • Μια εσωτερική ομάδα δεν βλέπει την γονική, δεν μπορεί να καλέσει τμήματα και συναρτήσεις της γονικής, ή άλλης διπλανής ομάδας. αλλά βλέπει ότι έχει περιεχόμενο, και είναι δημόσιο για τις περιεχόμενες ομάδες. Υπάρχει μια ειδική εντολή που επιτρέπει να συνδεθεί με αναφορά μια τιμή/πεδίο τηςγονικής ομάδας, και με αυτήν φτιάχνουμε πολύπλοκες ιδιότητες ομάδων.
  • Υπάρχουν ισχνές αναφορές αν θέλουμε να "συνδέσουμε" ομάδες. Αυτές είναι το πραγματικό όνομα κάθε ομάδας, και μας το δίνει η συνάρτηση Ισχνή$(), Weak$(). Αυτές γράφονται σε αλφαριθμητικά.

 Υπερκλάση ΑΛΦΑ {
      Μοναδικό:
            Χ, Υ
            Πίνακας Α(20)
      Δημόσιο:
      \\ η Κ θα υπάρχει και ως Κ της υπερκλάσης και ως Κ του αντικειμένου
            Κ=10
            Τμήμα Εμφάνισε {
                  Για Υπερκλάση, Αυτό {
                        \\ εμφανίζουμε το Κ της κλάσης και του αντικειμένου
                        Τύπωσε .Κ, ..Κ
                        \\ Τα .Χ και .Υ είναι μόνο για τη κλάση
                        ++
                        Τύπωσε .Χ,
                        \\ Και πίνακες μπορούμε να βάλουμε ως μοναδικά στοιχεία.
                        Τύπωσε .Α()
                  }
            }
}
Κ=ΑΛΦΑ
Κ.Εμφάνισε

Κλάση Δέλτα {
      Ιδιότητα ΜόνοΑνάγνωση {Αξία} = 1234321
      Τμήμα Δέλτα (Αυτό) {}
}
Μ=Δέλτα(ΑΛΦΑ)
Μ.Εμφάνισε
Τύπωσε Μ.ΜόνοΑνάγνωση
\\ εδώ ο Α() έχει τα τμήματα κοινά για όλα τα στοιχεία.
\\ και επιπλέον όλα τα στοιχεία έχουν σύνδεση με την κλάση του ΑΛΦΑ
\\ ακόμα και να "χαθεί" το ΑΛΦΑ, η σύνδεση διατηρεί το αντικείμενο με τα στοιχεία.
Πίνακας Α(100)=Δέλτα(Αλφα)
Α(4).Εμφάνισε

Και ένα δεύτερο, όπου ένα αντικείμενο έχει δυο ομάδες, και σε κάθε ομάδα μια υπερκλάση:

ΥπερΚλάση Κάπα1 {
      χ=10
      Τμήμα Εμφάνισε {
            Για ΥπερΚλάση {
                  ++
                  Τύπωσε .χ, Αυτό.χ
            }
      }
}
ΥπερΚλάση Κάπα2 {
      χ=50
            Τμήμα Εμφάνισε {
            Για ΥπερΚλάση {
                  ++
                  Τύπωσε .χ, Αυτό.χ
            }
      }
}
Ομάδα Άλφα {
      Ομάδα Βήτα {
            \\ δεν θα βάλουμε εδώ ορισμούς γιατί έχει η ΥπερΚλάση
            \\ αλλά θα μπορούσαμε να ξαναπαίξουμε τον ορισμό και να αλλάξουμε
            \\ ακόμα και ένα τμήμα που ορίστηκε στην υπερκλάση για τη συγκεκριμένη ομάδα.
      }
}
\\ Πρώτα θα συγχωνεύσουμε τη ΥπερΚλάση (θα φτιάξει νέα μέλη και θα δώσει και ένα δείκτη)
Στη Άλφα.Βήτα=Κάπα2
Στη Άλφα=Κάπα1

\\ Τώρα έχουμε δυο ΥπερΚλάσεις, μια για την εξωτερική Ομάδα, και μια για την εσωτερική Ομάδα
Άλφα.Εμφάνισε              \\ 11 10
Άλφα.Βήτα.Εμφάνισε   \\ 51 50
Ζ=Άλφα

Ζ.Εμφάνισε                      \\ 12 10
Ζ.Βήτα.Εμφάνισε           \\ 52 50
Άλφα.Εμφάνισε              \\ 13 10
Άλφα.Βήτα.Εμφάνισε   \\ 53 50

Πίνακας Α(10)
Α(3)=Ζ
Α(3).Εμφάνισε \\ 14 10
Α(3).Βήτα.Εμφάνισε \\ 54 50

Κατάσταση Κατ1= 100:=Ζ
\\ τα κλειδιά είναι αλφαριθμητικά, απλά φαίνονται και ως αριθμοί!
Κατ1("100").Εμφάνισε \\ 15 10
Κατ1(100).Βήτα.Εμφάνισε \\ 55 50



Παραδείγματα με αγγλικές εντολές:
Superclass Alpha {
      Unique:
            x, y
            Dim A(20)
      Public:
      \\ k created for superclass and for object (two different things, two differnet values)
            k=10
            Module DisplayInfo {
                  For Superclass, This {
                        .k++
                        \\ in one prin we can handle k from superclass and k from object.
                        Print .k, ..k
                        \\  .x and .y are unique here
                        .x++
                        Print .x, .y
                         \\ Here we print arrays (only from Superclass, because we dedined in Unique part)
                        Print .A()
                  }
            }
}
\\ there is no Alpha.DisplayInfo, or other value. Alpha is closed, only can create/merge other objects (groups)
k=Alpha
k.DisplayInfo
Class Delta {
      Property ReadOnly {Value} = 1234321
      Module Delta (This) {}
}
m=Delta(Alpha)
m.DisplayInfo
Print m.ReadOnly
\\ here Array A() has a special holder for all items (are groups), for code only.
\\ because all Delta() get Alpha as SuperClass (merged to This in constructor)
\\ all have SuperClass common variables/arrays through a dedicated pointer
\\ so we can export this array, and return from this block (maybe a module)
\\ and Alpha erased, but not data if there are objects who hold pointer to them
Dim A(100)=Delta(Alpha)
A(4).DisplayInfo

Another one (the same as the programms with greek commands, M2000 has double vocabulary. Greek and English):


Superclass Kappa1 {
      x=10
      Module Display {
            For Superclass {
                  .x++
                  Print .x, This.x
            }
      }
}
Superclass Kappa2 {
      x=50
            Module Display {
            For Superclass {
                  .x++
                  Print .x, This.x
            }
      }
}
\\ we can create groups using Group command
Group Alfa {
      Group Beta {
            \\ no definitions yet we get from superclass
      }
}
\\ first we bind superclass for each group
Let Alfa.Beta=Kappa2
Let Alfa=Kappa1

\\ now we have two superclass, one for outer group, and one for inner group
Alfa.Display            \\ 11 10
Alfa.Beta.Display   \\ 51 50

Z=Alfa

Z.Display                 \\ 12 10
Z.Beta.Display        \\ 52 50
Alfa.Display            \\ 13 10
Alfa.Beta.Display   \\ 53 50

Dim A(10)
A(3)=Z
A(3).Display \\ 14 10
A(3).Beta.Display \\ 54 50

Inventory Inv1 = 100:=Z
\\ keys for inventories are strings, but we can handle like numbers if they are like numbers
Inv1("100").Display \\ 15 10
Inv1(100).Beta.Display \\ 55 50