Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ερώτημα για object orientation

Îåêßíçóå áðü ôï ìÝëïò Panos Kousidis. Τελευταία δημοσίευση από το μέλος KelMan στις 28-03-2007, 16:32. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-03-2007, 12:44 27225

    Ερώτημα για object orientation

    Δεν ξέρω αν το διατύπωσα σωστά αλλά έχω το εξής πρόβλημα

    Έχω μία κλάση "Γονιός" και μία κλάση "Παιδί"
    Η κλάση "Γονιός" μπορεί να περιέχει πολλά instances της κλάσης "Παιδί".

    Αυτό που με ενδιαφέρει κυρίως είναι εάν γίνεται με κάποιο τρόπο το κάθε instance της κλάσης "Παιδί" να ξέρει αυτόματα σε ποιο "Γονιό" ανήκει χωρίς να περνάω τον "Γονιό" στο constructor του.
    Δηλαδή έχοντας το εξής παράδειγμα:

    Dim Panos as New Γονιός
    Dim Eirini as Παιδί = Panos.CreateChild("Ειρήνη")

    Msgbox (Eirini.Gonios)
    Με κάποιο τρόπο το property Gonios του "Παιδί" να βρίσκει σε ποιο "Γονιό" ανήκει

    Πώς ακριβώς θα υλοποιήσω κάτι τέτοιο;



    Panos
  •  28-03-2007, 12:56 27226 σε απάντηση της 27225

    Απ: Ερώτημα για object orientation

    Μπορείς απλά μέσα στην CreateChild να θέτεις την τιμής της Giorgos στον parent, π.χ.

    Dim newChild As New Child
    Child.Name="Ειρήνη"
    Child.Parent=Me


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-03-2007, 13:05 27230 σε απάντηση της 27226

    Απ: Ερώτημα για object orientation

    Ναι έτσι το ξέρω ότι μπορεί να γίνει, είναι όμως κάτι αντίστοιχο του να το βάζω στο constructor. Εγώ δε θέλω να ορίσω πουθενά στην parent class ότι το child θα έχει parent τον Γιώργο. Θέλω μέσα στην ChildClass να μάθω αν μπορεί να γίνει κάτι

    Panos
  •  28-03-2007, 13:18 27231 σε απάντηση της 27230

    Απ: Ερώτημα για object orientation

    Για να κάνεις κάτι τέτοιο, θα πρέπει ουσιαστικά να βρεις ποιός καλεί τον constructor και να θέσεις την parent property σε αυτόν. Όχι ότι δεν μπορείς να το κάνεις, αλλά θα πρέπει ουσιαστικά να ψάξεις στο call stack να δεις ποιός κάλεσε τον constructor. Πολύς μπελάς για το τίποτα.

    Γιατί θέλεις να κάνεις κάτι τέτοιο? Δεν σε περιορίζει σε τίποτε να θέσεις το parent property είτε στον constructor, είτε στην CreateChild. Έτσι εξάλλου δουλεύουν σχεδόν όλα τα collections του .ΝΕΤ. Αν αντιμετωπίζεις κάποιο περιορισμό που δεν σου επιτρέπει να το κάνεις αυτό, ίσως να έχει πρόβλημα η σχεδίαση σου κάπου αλλού.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-03-2007, 13:34 27234 σε απάντηση της 27231

    Απ: Ερώτημα για object orientation

    να προσθέσω κάτι κι εγώ... αν και είναι ακριβώς όπως τα λέει ο Παναγιώτης.

    Στην προκειμένη περίπτωση για να γίνει το παιδί χρειάζονται δυο γονείς! Άρα δεν πρέπει ο γονιός να έχει function CreateChild. Η function πρέπει να είναι static, να παίρνει ορίσματα δυο γονείς και να επιστρέφει collection παιδιών! Και φυσικά το αρχικό πρόβλημα μετατίθεται σε άλλο επίπεδο, μια που κάθε παιδί δεν έχει έναν parent, αλλά δυο!

    Κάτι μου λέει βέβαια ότι η χρήση των λέξεων παιδί-γονιός έγινε χάρην παραδείγματος... αλλά δεν μπορούσα να αντισταθώ στον πειρασμό! Big Smile
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  28-03-2007, 13:47 27236 σε απάντηση της 27231

    Απ: Ερώτημα για object orientation

    OK ευχαριστώ πολύ για τις γρήγορες απαντήσεις. Αυτό ήθελα να μάθω. Πάντως αφού είναι πολύς μπελάς για το τίποτα οκ θα κάνω συνέχεια CreateChild(Me).
    Όσο για την απάντηση του φίλου Δημήτρη: - LOL -

    Panos
  •  28-03-2007, 14:00 27240 σε απάντηση της 27236

    Απ: Ερώτημα για object orientation

    Αν και άργησα, να πω οτι αν είναι απολύτως απαραίτητο να έχεις γνώση του ποιός ανήκει σε τι χωρίς όμως τα "παιδιά" να περιέχουν πληροφορίες για τους "γονιούς" μπορείς να δημιουργήσεις μια ενδιάμεση κλάση η οποία θα παίζει το ρόλο του factory αλλά και του registry. Αυτή η κλάση θα είναι υπεύθυνη για τη δημιουργία "παιδιών" που ανήκουν σε "γονείς" μέσω κάποιας μεθόδου π.χ. CreateNewChild(objParent), όπου θα περνάς φυσικά τον "γονιό". Απλά, αντί να κρατάει το "παιδί" την πληροφορία, θα την κρατάει ένα άλλο object (ας το πούμε registry - υπάρχει design pattern που να πλησιαζει αυτό το concept Πανο; ).

    Το θέμα είναι οτι και πάλι θα πρέπει να έχεις μια εξάρτηση από αυτό το registry, μια και θα πρέπει να ενημερώνεται όταν ένα "παιδί" ή ένας "γονιός" γίνεται dispose / nothing. Που σημαίνει οτι αναγκαστικά θα πρέπει τόσο τα "παιδιά" όσο και οι "γονείς" να πετάνε events για οτιδήποτε συμβαίνει που μπορεί να επηρεάσει το registry, και το registry να ακολουθεί το singleton pattern για να είσαι σίγουρος οτι υπάρχει ένα και μόνο ένα registry στο οποίο αναφέρεσαι ανά πάσα στιγμή.

    Τα λέω πολύ χοντρικά βέβαια, αλλά κάπως έτσι είναι η ιδέα. Το θέμα είναι οτι όλο αυτο το concept εισάγει φοβερή πολυπλοκότητα στον σχεδιασμό σου, την οποία θα πρέπει να υλοποιήσεις μόνο αν είσαι απολυτως σίγουρος οτι τη χρειάζεσαι.

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  28-03-2007, 16:04 27255 σε απάντηση της 27240

    Απ: Ερώτημα για object orientation

    Σε κατάλαβα cap και όντως αυτό είναι μια λογική αν θέλει κάποιος να μην κρατάει info στα παιδιά. Αυτό που ρωτούσα ήταν κάτι που μου έκανε εντύπωση : Δηλαδή πώς γίνεται ένα object να δημιουργεί ένα άλλο και να μην υπάρχει πουθενά στο 2ο object αυτόματα ένα reference στο object που το δημιούργησε... Αλλά εφόσον αυτό δεν είναι κάτι έτοιμο δεν αξίζει να μπλέξω το πρόγραμμα με περαιτέρω διαδικασίες. Ευχαριστώ!

    Panos
  •  28-03-2007, 16:32 27260 σε απάντηση της 27255

    Απ: Ερώτημα για object orientation

    Γιατί σου κάνει εντύπωση; Θα προσπαθήσω να το απλοποιήσω: Αν υποθέσουμε ότι φτιάχνουμε ένα object, πχ:

    Dim x as new Form1

    τότε ορίζουμε ένα reference (που ονομάζεται "x") και ουσιαστικά δείχνει στην περιοχή μνήμης που βρίσκεται το object. Η περιοχή μνήμης δεν γνωρίζει ποιό είναι το reference που της αντιστοιχεί. Το ίδιο ισχύει και όταν ορίζουμε ένα object μέσα από ένα άλλο object. Αν χρειάζεται μέσα από το referenced object να αναφερθούμε στο referee object θα πρέπει να υλοποιήσουμε εμείς τον μηχανισμό. Μάλιστα, στο COM αυτός ο μηχανισμός ήταν πηγή προβλημάτων γιατί πολλές φορές όταν προέκυπταν circular references τα οποία, λόγω της τεχνικής που έχει το COM για να καταστρέφει objects, δεν έφευγαν από τη μνήμη ακόμα και αν έβγαιναν από το scope.  


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems