Τετάρτη 26 Αυγούστου 2020

Πέρασμα αντικειμένων σε μεθόδους αντικειμένων

 Σε αυτό το άρθρο θα δούμε όλους τους τρόπους περάσματος μιας ομάδας (αντικείμενο) σε μέθοδο ομάδας. Θέλουμε μέσα στη μέθοδο να μπορούμε να διαβάσουμε τις ιδιωτικές μεταβλητές (ιδιότητες) της ομάδας που περνάμε, εφόσον η ομάδα είναι του ίδιου τύπου.

Μια ιδιωτική μεταβλητή δεν μπορεί να διαβαστεί έξω από μια ομάδα, εκτός αν η ομάδα βρίσκεται σε μέθοδο που ανήκει σε ίδιο τύπο με την ομάδα.

Οι τρόποι περάσματος είναι:

  • Με τιμή. Η ομάδα αντιγράφεται σε μια νέα ομάδα.
  • Με αναφορά. Η ομάδα αντιγράφεται σε νέο αντικείμενο όπου όλες οι ιδιότητες είναι αναφορές του αρχικού αντικειμένου. Η επίλυση της αναφοράς γίνεται στην μέθοδο που την αναγνωρίζει με πέρασμα ισχνής αναφοράς (η ισχνή απλά δείχνει για ποια ομάδα θα βγει η αναφορά). Οι μέθοδοι της ομάδας απλά αντιγράφονται, και μπορούν να αλλαχθούν (αν δεν είναι τελικές) χωρίς να γίνει η αλλαγή στην αναφερόμενη ομάδα.
  • Με τιμή δείκτη ομάδας. Αντιγράφεται μόνο ο δείκτης. (αυτό γίνεται και στην Python)
  • Με αναφορά δείκτη ομάδας. Στη κλήση μεθόδου μπαίνει η ισχνή αναφορά του δείκτη, και στην μέθοδο φτιάχνεται μια νέα μεταβλητή ως αναφορά αυτής που δείχνει η ισχνή αναφορά. Έτσι αν αλλάξουμε δείκτη σε άλλη ομάδα (αντικείμενο) τότε η αλλαγή θα περάσει πίσω (αφού και τα δυο ονόματα δείχνουν τον ίδιο δείκτη, όχι ως αντίγραφο, αλλά τον ίδιο δείκτη σε ένα σημείο κοινό για τα δυο ονόματα).
Παρακάτω είναι το πρόγραμμα με τέσσερα τμήματα (τα τμήματα είναι ανεξάρτητα μεταξύ τους, και στο πέρας εκτέλεσης διαγράφουν ό,τι φτιάχνουν - εκτός από αυτά που μπορούν να επιστρέφουν σε ένα σωρό τιμών - εδώ δεν χρησιμοποιούμε τον σωρό τιμών)

Κάθε κλάση έχει τρία μέρη προσδιορισμένα από τις ετικέτες ιδιωτικό, δημόσιο, κλάση. Η ετικέτα κλάση δηλώνει στον διερμηνευτή ότι αυτά που θα ακολουθήσουν θα είναι μέλη στη κλάση μόνο κατά τη φάση δημιουργίας της, δηλαδή δεν θα περιέχονται στο τελικό αντικείμενο. Συνήθως εκεί βάζουμε τον κατασκευαστή της κλάσης, δηλαδή ένα τμήμα με το όνομα της κλάσης. Όταν καλούμε τη κλάση ως συνάρτηση, τότε τα ορίσματα που δίνουμε μπαίνουν σε ένα νέο σωρό τιμών και καλείται το τμήμα. Η επιστροφή από τον κατασκευαστή είναι προκαθορισμένη, είναι το αντικείμενο ομάδα που δημιουργούμε. Δείτε ότι ο κατασκευαστής ζητάει δυο τιμές, τα .χ και .ψ (ή Αυτό.χ και Αυτό.ψ). Επειδή αυτά έχουν τιμές, αν δεν υπάρχουν τιμές στο σωρό τιμών δεν θα βγει λάθος. Αντίθετα αν είχαμε ένα νέο όνομα ως τυπική παράμετρο και δεν δίναμε τιμή στη κλήση θα έβγαινε λάθος, επειδή η Μ2000 δεν επιτρέπει να μην δώσουμε αρχική τιμή σε ένα νέο όνομα. Στις κλάσεις όταν ορίζουμε μεταβλητές μπορούμε να μην δώσουμε αρχική τιμή πχ  Χ=10, Ζ, Κ  θα βάλει στα Ζ και Κ τιμή 0 (τύπος double ή διπλός). Μια κλάση έχει έναν ορισμό ομάδας, και ο ορισμός ομάδας έχει ξεχωριστό διερμηνευτή, και έτσι γίνεται να μην δώσουμε τιμή σε νέο όνομα!

Δείτε επίσης ότι όταν θέλουμε να περάσουμε κάτι με αναφορά θα βάλουμε το & στη κλήση και πρέπει και από την μεριά της μεθόδου να έχουμε το & στο όνομα της μεταβλητής όπου θα διαβαστεί η αναφορά.


Τμήμα Α {

      \\ Με πέρασμα με τιμή (κ ως αλφα)
      Κλάση αλφα {
      ιδιωτικό:
            χ=10, ψ=30
      δημόσιο:
            Τμήμα ΔείξεΤο(κ ως αλφα) {
                  Τύπωσε κ.χ, κ.ψ
            }
      κλάση:
            Τμήμα άλφα(.χ, .ψ) {}
      }
      Μ=αλφα()
      Ν=αλφα(500, 300)
      Μ.ΔείξεΤο Ν            ' Δείχνει 500 300
      Ν.ΔείξεΤο Μ            ' Δεχνει 10 30
      Τύπωσε Έγκυρο(Μ.χ)=Ψευδές       ' η Μ.χ δεν είναι δημόσια, είναι ιδιωτική
}
Τμήμα Β {
      \\ Με πέρασμα με αναφορά (&κ ως αλφα)
      Κλάση αλφα {
      ιδιωτικό:
            χ=10, ψ=30
      δημόσιο:
            Τμήμα ΔείξεΤο(&κ ως αλφα) {
                  Τύπωσε κ.χ, κ.ψ
            }
      κλάση:
            Τμήμα άλφα(.χ, .ψ) {}
      }
      Μ=αλφα()
      Ν=αλφα(500, 300)
      Μ.ΔείξεΤο &Ν            ' Δείχνει 500 300
      Ν.ΔείξεΤο &Μ            ' Δεχνει 10 30
      Τύπωσε Έγκυρο(Μ.χ)=Ψευδές       ' η Μ.χ δεν είναι δημόσια, είναι ιδιωτική
}
Τμήμα Γ {
      \\ Με πέρασμα με δείκτη (κ ως *αλφα)
      \\ το -> δημιουργεί δείκτη
      \\ το => χρησιμοποιείται αντί της τελείας σε δείκτες σε ομάδες
      Κλάση αλφα {
      ιδιωτικό:
            χ=10, ψ=30
      δημόσιο:
            Τμήμα ΔείξεΤο(κ ως *αλφα) {
                  Τύπωσε κ=>χ, κ=>ψ
            }
      κλάση:
            Τμήμα άλφα(.χ, .ψ) {}
      }
      Μ->αλφα()
      Ν->αλφα(500, 300)
      Μ=>ΔείξεΤο Ν            ' Δείχνει 500 300
      Ν=>ΔείξεΤο Μ            ' Δεχνει 10 30
      Τύπωσε Έγκυρο(Μ=>χ)=Ψευδές       ' η Μ=>χ δεν είναι δημόσια, είναι ιδιωτική
}
Τμήμα Δ {
      \\ Με πέρασμα με δείκτη με αναφορά (&κ ως *αλφα)
      \\ το -> δημιουργεί δείκτη
      \\ το => χρησιμοποιείται αντί της τελείας σε δείκτες σε ομάδες
      Κλάση αλφα {
      ιδιωτικό:
            χ=10, ψ=30
      δημόσιο:
            Τμήμα ΔείξεΤο(&κ ως *αλφα) {
                  Τύπωσε κ=>χ, κ=>ψ
            }
      κλάση:
            Τμήμα άλφα(.χ, .ψ) {}
      }
      Μ->αλφα()
      Ν->αλφα(500, 300)
      Μ=>ΔείξεΤο &Ν            ' Δείχνει 500 300
      Ν=>ΔείξεΤο &Μ            ' Δεχνει 10 30
      Τύπωσε Έγκυρο(Μ=>χ)=Ψευδές       ' η Μ=>χ δεν είναι δημόσια, είναι ιδιωτική
}
Α : Β : Γ : Δ



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

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

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