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

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

Δημοσ.

Εχω τις εξης κλάσεις :

 

Α{}    <--   D{  ... πινακας τυπου Α ... }

 ^

Β{}

 ^

C{}

 

 

 

 

Η B{} κληρονομει την A{} και η C{} κληρονομει την B{} επομενος η Β αποτελει εξειδικευση της A και η C εξειδικευση της B, σωστα; 

 

H D περιεχει ενα πινακα τυπου Α.

Επισης η καθε μια περιεχει διαφορες μεταβλητες, η Α περιεχει τις μεταβλητες a1, a2, a3

η Β τις μεταβλητες b1 , b2 , b3 κτλ κτλ..

 

Ο constractor της D δεχεται σαν ορισμα μονο την μεταβλητη d1 και τιποτα αλλο... Ολες οι αλλες κλασεις μπορει να εχουν τους καταλληλους κατασκευαστες..

 

Ολες οι κλασεις μπορει να εχουν τις καταλληλες μεθοδους...

 

 

Μπορω να φτιαξω αντικειμενο τυπου D και να προσθετω σε αυτο αντικειμενο τυπου B και καποιες αλλες φορες αντικειμενο τυπου C ;;

 

Δεν θελω να μου γραψετε κωδικα, απλα να μου πειτε αν ειναι δυνατον να κανω κατι τετοιο και αν ναι, εντελος θεωρητικα πως να το κανω..

 

 

Eυχαριστω!

 

Δημοσ.

Ένας πίνακας Τύπου Α μπορεί πολύ απλά να αποθηκεύσει και αντικείμενα τύπου Β και C αφού είναι subclasses π.χ.

Α[] a = new A[5];

a[0] = new A();
a[1] = new C();
a[2] = new B();
a[3] = new A();

//....

Δεν ξέρω αν θέλεις κάτι πιο εξειδικευμένο, αν ναι το συζητάμε.

Δημοσ.

Αφου ο πινακας ειναι τυπου Α μπορει να δεχτει οτιδηποτε κληρονομει την Α.

 

Όπως το εννοείς είναι βέβαια σωστό, αλλά για όσους θέλουν να εμβαθύνουν λίγο: technically δε μπορείς να υποθέσεις κάτι τέτοιο.  Variance = ωραίο θέμα για να εμβαθύνει κάποιος που ήδη ξέρει δέκα πράγματα στο πώς λειτουργούν εσωτερικά compilers και runtimes για να υποστηρίξουν features που φαίνονται "προφανή" αν δεν τα δεις με μαθηματική λογική.

Δημοσ.

To ειχα συναντήσει στην C# οταν ηθελα να γράψω αυτό και έβγαζε λάθος o compiler.

 List<Control> list= new List<TextBox>(); //Error 

Αφου το TextBox ειναι Control γιατι βγάζει λάθος??

....

Για να σε προστατέψει από αυτό  (Το Button ειναι Control επίσης)

list.Add(new Button()); 

Με πινακες ειναι πιο ελευθερο. Μπορεις να γράψεις το παρακάτω.

Control[] arr = new TextBox[10];
arr[0] = new Button();

Δημοσ.

Ναι, όντως είναι για να σε προστατέψει (ή, αν θέλεις να το δεις διαφορετικά: για να μπορεί να διατηρήσει τη μαθηματική βεβαιότητα πως οτιδήποτε είναι μέσα στη List είναι όντως TextBox).

 

Το θέμα με τους πίνακες είναι ότι όπως λέει και στη wikipedia, αν ήταν invariant τότε θα ήταν πολύ λιγότερο χρήσιμοι οπότε "αναγκαστικά" και "για ιστορικούς λόγους" έγιναν covariant (και ο compiler προσθέτει ένα runtime type check σε κάθε εισαγωγή στοιχείου), ενώ με την έλευση του .NET 2.0 και των generics τα πράγματα έγιναν πολύ πιο "σωστά".

 

Όπως είπα παραπάνω το ζήτημα έχει πολύ ψωμί και κατά την άποψή μου είναι ιδιαίτερα ενδιαφέρον γιατί αποτελεί παράθυρο όχι μόνο στα εσωτερικά ενός compiler αλλά και στη θεωρία τύπων, παραπέμπω όποιον έχει όρεξη στο παλιό blog του Eric Lippert (αντίστροφη χρονολογική σειρά, ξεκινήστε από το τέλος).

  • Like 1
Δημοσ.

Εστω στο αρχικο παραδειγμα οτι εχω ενα αντικειμνο τυπου D το οποιο μεσω καταλληλων μεθοδων γεμισει τον πινακα τυπου A με στιγμιοτυπα της κλασης A,B,C...

 

Πως μπορω αν εχω προσβαση, να τυπωσω τις τιμες α1,α2 , β1, β2 κτλ κτλ μεσω του πινακα που βρισκεται στο στιγμιοτυπο της κλασης D;

Δημοσ.

.toString()  ^_^

 

αρκεί φυσικά να κάνεις τα κατάλληλα overrides στη μέθοδο toString().

 

 

 

-------------------

 

Γενικα σκέψου ότι μπορείς να κάνεις έναν πίνακα κλάσης Object και να βάλεις ότι αντικείμενο θες εκει μεσα μιας και η κλάση Object είναι η κλάση Θεός!!

Δεν ξέρω κατα πόσο χρήσιμο είναι αυτό αλλά το σίγουρο είναι ότι μπορείς να το κάνεις!

Επίσης μπορείς με τον τελεστή instanceof να ελέγχεις ποιάς κλάσης είναι το κάθε αντικέιμενο σε κάθε θέση του πίνακα σου!

 

καλή συνέχεια.

Δημοσ.

Οταν καλω την toString() περνω κατι της μορφης class_name@3ae86a5f

 

Θελω να περνω τις τιμες των πεδιων της class_name παντα μεσα απο τον πινακα με τα στιγμυοτυπα της class_name

Δημοσ.

Το μόνο που έχεις να κάνεις είναι να γράψεις:

 

@override
public String toString(){
      return [εδω τα πεδία της κλάσης που θες να επιστρέψεις σε μορφή String];
}

..στην κλάση που θες!

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

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

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

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

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

Σύνδεση

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

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