Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Θελω να ρωτησω το εξης(newbiw question alert!). Βλεπω συχνα την μεταβλητη(C#) object. Για παραδειγμα:

 

object myobject;

 

Οπως κι επισης τι σχεση εχει με τα αντικειμενα γενικοτερα(κλασσεις, μεθοδους, μεταβλητες που απ'οτι ξερω ειναι τα αντικειμενα) ?

Δημοσ.

η μεταβλητη object ειναι στην ουσια  ενα αντικειμενο, το οποιο μπορει στη συνεχεια να παρει οτι τιμες του ορισεις, δηλαδη να του ορισεις στη συνεχεια τον τυπο του.

 

 

Παραδειγμα στη VB.NET :

 

Dim objDb As Object
Dim myCollection As New Collection()
' Suppose myCollection has now been populated.
objDb = myCollection.Item(1)

Δημοσ.

η μεταβλητη object ειναι στην ουσια  ενα αντικειμενο, το οποιο μπορει στη συνεχεια να παρει οτι τιμες του ορισεις, δηλαδη να του ορισεις στη συνεχεια τον τυπο του.

 

 

Παραδειγμα στη VB.NET :

 

Dim objDb As Object

Dim myCollection As New Collection()

' Suppose myCollection has now been populated.

objDb = myCollection.Item(1)

Δηλαδη κατι σαν το var ?? VB δεν ξερω.. οποτε δεν καταλαβαινω και πολλα απο τον κωδικα :/

 

Αρα ουσιαστηκα η μεταβλητη object μπορει να γινει string, integer, float, μεθοδος και κλασση. Σωστα ? Ειναι ουσιαστηκα ενα "ουδετερο εδαφος" που ολα τα object μπορουν να δηλωθουν, σωστα ?

Δημοσ.

Ο όρος object αναφέρεται σε αντικείμενο. Όμως στη C# μπορείς να δώσεις τιμή και αυτή θα μπει σε ένα κρυφο αντικείμενο και μετά στο object. Αυτό το πακετάρισμα, το λέει boxing.

Δημοσ.

Μία μεταβλητή τύπου object μπορεί να δείχνει σε οποιουδήποτε άλλου τύπου αντικείμενο (μιας και τα πάντα κληρονομούν από αυτό τον τύπο). Για να χρησιμοποιήσεις με τον σωστό τύπο αυτό στο οποίο δείχνει θα πρέπει να κάνεις το κατάλληλο cast πρώτα.

 

π.χ.

 

 

object x = new Dictionary<int, string>();

((Dictionary<int, string>)x).Add(666, "Satan");

 

Αν δεν κάνεις το cast, διαθέσιμες μέθοδοι για το αντικείμενο x είναι μόνο αυτές του Object τύπου.

  • Like 1
Δημοσ.

Να ρωτήσω..

Θα μπορούσε να είχε ένα αντικείμενο τύπου dictionary και να του έδινε τιμή το object, ώστε και τα δύο να δείχνουν το ίδιο αντικείμενο, αλλά το τύπου dictionary δεν θα ήθελε casting;

Δημοσ.

Μία μεταβλητή τύπου object μπορεί να δείχνει σε οποιουδήποτε άλλου τύπου αντικείμενο (μιας και τα πάντα κληρονομούν από αυτό τον τύπο). Για να χρησιμοποιήσεις με τον σωστό τύπο αυτό στο οποίο δείχνει θα πρέπει να κάνεις το κατάλληλο cast πρώτα.

 

π.χ.

object x = new Dictionary<int, string>();

((Dictionary<int, string>)x).Add(666, "Satan");

Αν δεν κάνεις το cast, διαθέσιμες μέθοδοι για το αντικείμενο x είναι μόνο αυτές του Object τύπου.

Το cast δεν ξερω τι ειναι... Και στο παραδειγμα σου, το dictionary υποτιθεται οτι ειναι καποιου ειδους μεθοδος. Σωστα ?

  • Moderators
Δημοσ.

Όχι, το dictionary είναι ο τύπος, το x είναι το αντικείμενό σου και το Add είναι η μέθοδος. Θα σου πρότεινα να αφήσεις την ερώτηση, να ασχοληθείς με κάποια βασικά πράγματα και να την ξανακοιτάξεις όταν θα έχεις κάποιες βάσεις.

  • Like 1
Δημοσ.

 

           Dictionary<int, string> x = new Dictionary<int, string>();
            object y = x;

            x.Add(666, "Satan");
            ((Dictionary<int, string>)y).Add(333, "Holy Spirit");

            foreach (int key in x.Keys)
            {
                Console.WriteLine("Key" + key.ToString() + ":" + x[key]);
            }
            Console.ReadKey();

 

Στο output φαίνεται πως στο dictionary υπάρχουν και τα δύο key/value pairs.

 

Το Dictionary είναι μία δομή που σου προσφέρει το .net για να αποθηκεύεις ζευγάρια από κλειδιά/τιμές. Αντικατέστησε το με όποιο άλλο τύπο αντικειμένου θες και ισχύουν τα ίδια (πέρα από τις διαθέσιμες μεθόδους, public fields, κλπ.).

Δημοσ.
           Dictionary<int, string> x = new Dictionary<int, string>();
            object y = x;

            x.Add(666, "Satan");
            ((Dictionary<int, string>)y).Add(333, "Holy Spirit");

            foreach (int key in x.Keys)
            {
                Console.WriteLine("Key" + key.ToString() + ":" + x[key]);
            }
            Console.ReadKey();

Στο output φαίνεται πως στο dictionary υπάρχουν και τα δύο key/value pairs.

 

Το Dictionary είναι μία δομή που σου προσφέρει το .net για να αποθηκεύεις ζευγάρια από κλειδιά/τιμές. Αντικατέστησε το με όποιο άλλο τύπο αντικειμένου θες και ισχύουν τα ίδια (πέρα από τις διαθέσιμες μεθόδους, public fields, κλπ.).

 

Α οκ. Ουσιαστηκα ειναι κατι σαν array το dictionary....

 

Αρα.. για να κανω ανακεφαιλαιωση. Η μεταβλητη object δεχεται(αποθηκευει) ολα τα αντικειμενα(int,string,var,double,float,classes,methods). Οσα δεν ειναι object, μπορουν να αποθηκευτουν μονο αν γινει casting(ειδα τι ειναι στο donetperls). Σωστα, η καταλαβα κατι λαθος ?

  • Moderators
Δημοσ.

Το object δεν είναι μεταβλητή. Μια μεταβλητή μπορεί να είναι τύπου object. Μία κλάση δεν είναι object, ούτε και μια μέθοδος. Μια μεταβλητή τύπου object μπορεί να αποθηκεύσει μια μεταβλητή οποιουδήποτε άλλου τύπου, αλλά για να χρησιμοποιήσεις τις μεθόδους του άλλου τύπου πρέπει πρώτα να κάνεις cast.

Όπως είπα και στο προηγούμενο post, καλύτερα άσε αυτή την ερώτηση και ασχολήσου με κάτι πιο απλό. Ακόμα και αν (νομίζεις ότι) κατάλαβες, είναι πολύ πιθανό να μπερδευτείς στη συνέχεια.

Δημοσ.

Το object δεν είναι μεταβλητή. Μια μεταβλητή μπορεί να είναι τύπου object. Μία κλάση δεν είναι object, ούτε και μια μέθοδος. Μια μεταβλητή τύπου object μπορεί να αποθηκεύσει μια μεταβλητή οποιουδήποτε άλλου τύπου, αλλά για να χρησιμοποιήσεις τις μεθόδους του άλλου τύπου πρέπει πρώτα να κάνεις cast.

Όπως είπα και στο προηγούμενο post, καλύτερα άσε αυτή την ερώτηση και ασχολήσου με κάτι πιο απλό. Ακόμα και αν (νομίζεις ότι) κατάλαβες, είναι πολύ πιθανό να μπερδευτείς στη συνέχεια.

Αντι να πω μια μεταβλητη τυπου object καθε φορα... λεω μια μεταβλητη object. Εχει διαφορα μιας λεξης.. αλλα εννοω το ιδιο πραμα. Συγγνωμη αλλα οι κλασσεις και και οι μεθοδοι δεν θεωρουνται αντικειμενα ?? Συγγνωμη αλλα ειτε θα τα ρωτησω εδω...η θα ανοιξω καινουριο θεμα. Οποτε λεω επιδη δεν εχουμε ξεφυγει απο το θεμα.. να το συνεχισω εδω.

Δημοσ.

Η κλάση είναι τα blueprints ενός αντικειμένου. Δεν είναι κανένα αντικείμενο. Δεν πιάνει χώρο στην μνήμη μία κλάση. Μία κλάση MyClass για παράδειγμα, ορίζει τις συναρτήσεις και τις μεταβλητές που θα έχουν τα αντικείμενα (instances) της MyClass. Η κλάση είναι το specification, ο ορισμός του πώς διαμορφώνεται το αντικείμενο MyClass, αλλά δεν είναι το ίδιο το αντικείμενο.

 

Αν θες να κατασκευάσεις ένα αντικείμενο που ακολουθεί τις προδιαγραφές της κλάσης MyClass τότε το αρχικοποιείς δίνοντας του μνήμη, με αποτέλεσμα να έχεις ένα instance της κλάσης MyClass μέσα στο πρόγραμμά σου. Αν δηλώσεις μία κλάση αλλά δεν την χρησιμοποιήσεις πουθενά, θα είναι σαν να μην υπάρχει. Αν δηλώσεις ένα αντικείμενο κάποιας κλάσης, τότε ορίζεις πως το αντικείμενο αυτό πιάνει χώρο στην μνήμη σου.

MyClass object1 = new MyClass();

Ο τελεστής new, λέει στο λειτουργικό να κρατήσει μνήμη για την μεταβλητή (αντικείμενο) object1 που είναι τύπου MyClass. Η κλάση από μόνη της δεν κάνει τίποτα. Απλά είναι ένας <<τύπος>> που μπορούν να πάρουν τα αντικείμενά σου. Πολύ λιανικά, οι κλάσεις δεν είναι μεταβλητές είναι τύποι μεταβλητών. (κάπως απλοποιημένα το λέω, απλά για να καταλάβεις)

Δημοσ.

Ένα αντικείμενο έχει ιδιότητες και μεθόδους, σε όλες τις γλώσσες. Αυτό που ξεχωρίζει τα στατικά από τα μη είναι ότι από τα δεύτερα δεν βγάζεις νέο, που σημαίνει ότι υπάρχει ένα. Αν έχεις ένα στατικό, λοιπόν, με μια μέθοδο, τότε μπορείς να το λες αντικείμενο, ενώ μια μέθοδο χρησιμοποιείς.

Είναι παρεξηγημένη η έννοια του αντικειμένου. Γενικά ένα αντικείμενο έχει ένα πίνακα, με διευθύνσεις ρουτινών που ανταποκρίνονται σε κάθε interface, το οποίο προβλέπει τι πρέπει να έχει το αντικείμενο. Αυτό που δεν βλέπουμε είναι το type library που φτιάχνει ο compiler,ώστε όταν καλούμε μια μέθοδο Χ στο αντικείμενο Α με βάσει την θέση του πίνακα που κρατάει η Α και δεν είναι γνωστή αν δεν δοθεί μνήμη, προσθέτει ένα offset, ένα σταθερό επιπλέον στην τιμή του Α και εκεί είναι η ρουτίνα της μεθόδου. Σίγουρα περνάει και η Α για να έχει πρόσβαση η μέθοδος στις ιδιότητες του αντικειμένου. Αυτό το βλέπουμε και στην python με το self, την αναφορά στο αντικείμενο, μέσα στις μεθόδους του.

Τα αντικείμενα COM έχουν διπλό interface, το ένα λέγεται IDispatch, και με στάνταρ τρόπο ρωτάς για τη μέθοδο Χ ποιος είναι ο αριθμός του και κάνεις invoke τον αριθμό και βάζεις τις παραμέτρους.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...