trad Δημοσ. 19 Μαρτίου 2004 Δημοσ. 19 Μαρτίου 2004 Μία ερώτηση για JAVA. 1) Έστω μια κλάση Χ -superclass- και μία Υ -subclass της Χ-. Έστω, λοιπόν, ότι η Χ δεν έχει constructor χωρίς ορίσματα (no arguments constructor), αλλά 'εχει δύο constructors ο ένας X(int a, int και ο άλλος Χ(double a, String . Έστω, επίσης ότι οι constructors της subclass (Υ) δεν κάνουν explicit (αν το λέω σωστά) call του constructor της superclass. Εννοείται ότι σε αυτή την περίπτωση αυτόματα καλείται o no-arguments constructor της superclass implicity απο τον constructor της subclass. Σε αυτή την περίπτωση ποιόν απο τους δύο καλεί?
javanidhs Δημοσ. 19 Μαρτίου 2004 Δημοσ. 19 Μαρτίου 2004 κανενα απο τους 2. ετσι και αλλιες δεν κανεις κληση σε καποιον απο αυτους που παρεχοντε (Super) Μπορεις να παραεις απαντηση στο ερωτημα σου...με τον να γραψεις 2 απλες κλασεις οπως τιις περιγραφεις. Να θυμασαι επισης το εξης! Στην Java καθε κλαση πρεπει να εχει εναν constructor. Γιαυτο λοιπον οταν ο προγραμματιστης δεν παρεχει εναν ...(το ξεχασε πχ) η Java αυτοματα δημιουργει εναν ...τον λεγομενο default constructor (χωρις ορισματα χωρις τιποτα).
trad Δημοσ. 20 Μαρτίου 2004 Μέλος Δημοσ. 20 Μαρτίου 2004 Μια ακόμα ερώτηση που θέλω να κάνω είναι η εξής: Το ποιές είναι οι "τυπικές" διαφορές μεταξύ interface και abstract class ξέρω. Παρά λοιπόν τις διαφορές τους (στην σύνταξη και κάποιες άλλες) είναι πάρα πολλές φορές (αν όχι πάντα) που μπορείς να αντικαταστήσεις μία abstract με ένα interface (εννοώ να φτιάξεις το ίδιο functionality είτε ορίζοντας μια abstract που θα γίνεται extend απο μια ομάδα απο subclasses είτε να ορίσεις ένα interface που θα γίνεται implement απο την ίδια ομάδα, κάνοντας χρήση των πλεονεκτημάτων του πολυμορφισμού σε κάθε περίπτωση). Αυτό που θέλω να ρωτήσω είναι στην πράξη πότε χρησιμοποιούμε το ένα και πότε το άλλο και γιατί. Μπορεί κάποιος να μου δόσει ένα παράδειγμα?
javanidhs Δημοσ. 21 Μαρτίου 2004 Δημοσ. 21 Μαρτίου 2004 http://javaboutique.internet.com/articles/ITJ/part05/page02.html μια abstract Κλαση σαν οντοτητα σημαινει οτι μπορει να περιεχει καποιο ειδος functionality Που ο προγραμματιστης της θα ηθελε να κληρονομηθει και στους αλλους χρηστες- απογονους αυτης της κλασης. Ενα interface ειναι μια πιο γενικοτερη εννοια..εδω μονο συμφωνουμε για το πως θα μοιαζουν ολες οι κλασεις που θα ακολοθουν το Interface.Ολοι εμεις που θα δημιουργησουμε τετοιες κλασεις κατα καποιο τροπο ειμαστς συμφωνοι οτι θα κανουμε οτι ειναι αναγκαιο για να πληρουμε τα standard. χωρις να κληρονομησουμε κατι ..καποιο βασικο functionality απο καποιον. Πχ Η κλαση οχημα εχει την μεθοδο.. > boolean ΙΗαveWheels Καθε υποκλαση της οχημα πρεπει να εχει μια τετοια μεθοδο.για καθαρα τυπικους και τεχνικους λογους...(συγνωμη για την απλοτητα του παραδειγματος) υπαρχει καποιος λογος αυτη η μεθοδος να μην κληρονομηθει απο τα αλλα οχηματα; Η χρηστικοτητα ειναι η ιδια!
Cue Δημοσ. 21 Μαρτίου 2004 Δημοσ. 21 Μαρτίου 2004 Έστω' date=' επίσης ότι οι constructors της subclass (Υ) δεν κάνουν explicit (αν το λέω σωστά) call του constructor της superclass. [b']Εννοείται ότι σε αυτή την περίπτωση αυτόματα καλείται o no-arguments constructor της superclass implicity απο τον constructor της subclass.[/b] Σε αυτή την περίπτωση ποιόν απο τους δύο καλεί? Προσοχή! Αν *δεν* έχεις δηλώσει *καθόλου* constructors για μία κλάση τότε και *μόνο* τότε ο compiler θα *βάλει* τον default όπως πολύ σωστά λέει ο javanidhs. Εφόσον όμως έχεις δηλώσει έστω και 1 constructor με arguments τότε ο no-arguments *δεν* τοποθετείται! Για την σχέση ή όχι που έχει ένα interface με μία abstract class, θα προσπαθήσω να δώσω ένα απλό παράδειγμα για να το καταλάβεις. [Ρεαλιστικό Παράδειγμα] *chic* Σκέψου πως εσύ σαν *άνθρωπος* έχεις ένα "interface" για να τρως *φαγητό* (το κάνεις μπουκίτσες, το βαζεις στο στόμα, το μασάς, το καταπίνεις). Τώρα το πως "το κάνεις μπουκίτσες", εξαρτάται από το τι τρως. Π.χ. Σε κάτι υγρό (μία σούπα) θα έπερνες μία κουταλιά Σε κάτι στερεό (ένα κρεατικό) θα το έκοβες με το μαχαίρι. Άραγνωρίζεις άμεσα μια *μερική* λειτουργία, αλλά όχι και όλες τις λεπτομέρειες στο πως μπορείς να φας ένα φαγητό. Αυτό θα μπορούσε να είναι μία abstract class. Είναι σημαντικό να αναγνωρίσεις από νωρίς τα interfaces που χρειάζονται για να προσδιορίσεις τα functionalities της εφαρμογής σου, καθώς αυτό βοηθάει στο να έχεις άμεσα μια γενική εικόνα του πως δουλεύει και τι ακριβώς κάνει το πρόγραμμα σου. Keep programming!
vagpap Δημοσ. 21 Μαρτίου 2004 Δημοσ. 21 Μαρτίου 2004 Δεν είμαι σίγουρος για την Java αλλά ισχύει στην C#. Σε μία δικιά σου class μπορείς να κληρονομήσεις όσα interfaces θες, αλλά μόνο μία κλάση (έστω και abstract).
trad Δημοσ. 22 Μαρτίου 2004 Μέλος Δημοσ. 22 Μαρτίου 2004 thanks όλους. Το πρώτο μου ερώτημα, προφανώς δεν το έθεσα σωστά και ξεκάθαρα. Έστω: > public class X { ... ... public X(double a, double b) { ... } public X(int a, int b) { ... } ... ... } ...και > public class Y extends X { ... ... public Y() { ; // το ξέρω ότι δεν χρειάζεται να ορίσω την no-args αλλά το κάνω επίτηδες για τις ανάγκες της ερώτησης } ... ... } Λοιπόν, όταν δημιουργήσουμε ένα object της Υ, εφόσν δεν υπάρχει explicit κλήση του constructor της super της μέσα στον δικό της constructor, σύμφωνα με τα τεφτέρια μου η JAVA η πρώτη δουλειά που θα κάνει είναι να φωνάξει απο μόνη της τον no-argument constructor της super. Έλα όμως που στην super έχω ορίσει δύο constructor αλλά κανένας απο τους 2 δεν είναι no-arguments... Τι θα γίνει σε αυτή την περίπτωση? Θα μου βγάλει σφάλμα ο compiler? Θα φωνάξει "με το έτσι θέλω" έναν υποθετικά υπαρκτό no-args constructor της X? Τι?
Γηρυόνης Δημοσ. 22 Μαρτίου 2004 Δημοσ. 22 Μαρτίου 2004 Όλες οι κλάσεις έχουνε ως υπερ-κλάση την κλάση Object η οποία έχει ένα no-arguments constructor.
Cue Δημοσ. 22 Μαρτίου 2004 Δημοσ. 22 Μαρτίου 2004 Εγώ πάλι γιατί έχω την εντύπωση ότι δε γίνεται? Για δοκίμασε το να δεις αν σε αφήνει.
trad Δημοσ. 22 Μαρτίου 2004 Μέλος Δημοσ. 22 Μαρτίου 2004 Δεν είμαι μπροστά σε Η/Υ με java αυτή τη στιγμή και δεν μπορώ να δοκιμάσω. Θα το δω όμως το απόγευμα. Αλλά απο την άλλη απ' όσο ξέρω και καταλαβαίνω οι constructors δεν κληρονομούνται.
Γηρυόνης Δημοσ. 22 Μαρτίου 2004 Δημοσ. 22 Μαρτίου 2004 Περίεργο, πετάει compile time error. Και είχα την εντύπωση ότι θα έψαχνε για constructor μέχρι να φτάσει στην Object.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.