Johnny Steeven Geschrieben 23. Mai 2008 Geschrieben 23. Mai 2008 Hallo, ich versuche gerade ein Programm zu schreiben aber bin noch ein Anfanger. Thema=Erben Kann man bitte mir sagen was bei dem Kopierkonstructor der erbende Klasse (Sache) falsch ist ? Hier ist das Programm: package Test; public class Tasche { private double grosse; public Tasche(double grosse){ this.grosse=grosse; } public Tasche(Tasche t){ //Kopierconstructor this.grosse=t.grosse; } public double Valeur(){ return grosse * 5; } } package Testi; import Test.Tasche; public class Sache extends Tasche { private double buch; private double heft; private Tasche t; public Sache(Tasche t , double buch , double heft){ super(t); this.t=t; this.buch=buch; this.heft=heft; } public Sache(Sache u ){ //Kopierkonstructor der Klasse Sache =>FEHLERMELDUNG this.t=new Tasche(u.t); this.buch=u.buch; this.heft=u.heft; } } Zitieren
kein-tee Geschrieben 23. Mai 2008 Geschrieben 23. Mai 2008 Deiner Klasse Tasche fehlt der Standard-Constructor: public Tasche() { // hier etwas Code } Die nicht genannte Fehlermeldung weisst im übrigen auf das Fehlen dessen hin: cannot find symbol symbol : constructor Tasche() location: class Test.Tasche Aller Anfang ist schwer, viel Erfolg! Gruß Zitieren
Johnny Steeven Geschrieben 23. Mai 2008 Autor Geschrieben 23. Mai 2008 Schau bitte noch mal an in der Klasse Tasche . public Tasche(double grosse){ this.grosse=grosse; } redest du nicht über diese Methode? Zitieren
kein-tee Geschrieben 23. Mai 2008 Geschrieben 23. Mai 2008 Nein ich rede nicht über diese Methode, ich meinte nur, dass in deiner Klasse Tasche kein Standard-Constructor, also ein Constructor ohne Parameter, zu finden ist. Fügst du ihn deiner Klasse hinzu, funktionierts mit dem kompilieren. Das hier anzutreffende Verhalten hat folgende Ursache: Der hier gezeigte Copy-Contructor ruft keinen Constructor der Klasse Tasche auf. Wird kein Constructor angegeben, so wird die Java Virtual Machine versuchen, den Standard-Constructor aufzurufen. Da deine Klasse Tasche keinen Standard-Constructor implementiert, beendet sich der Compiler mit o.g. Fehlermeldung. Möchtest du keinen Standard-Constructor verwenden, müsstest du den Copy-Constructor Sache#Sache(Sache u) folgendermaßen implementieren: public Sache(Sache u ) { super(u.t); this.t=new Tasche(u.t); this.buch=u.buch; this.heft=u.heft; } Im übrigen, warum hast du ein Objekt vom Typ Tasche in deiner Klasse Sache, wo doch Sache von Tasche abgeleitet ist? Nochwas: Benutze doch bitte das CODE Tag (Editor -> Raute-Zeichen), dann ist dein Code besser lesbar. Hoffe, das hilft dir weiter, Gruß Zitieren
Johnny Steeven Geschrieben 23. Mai 2008 Autor Geschrieben 23. Mai 2008 Danke erstmal . Bis später . Grüß Zitieren
kingofbrain Geschrieben 24. Mai 2008 Geschrieben 24. Mai 2008 Servus, solltest Du den parameterlosen Konstruktor in Tasche und Sache nicht brauchen, dann kannst Du natürlich auch im Kopierkonstruktor von Sache einen Super- oder This-Konstruktor aufrufen, z.B. public Sache(Sache u ){ this(u.t, u.buch, u.heft); } Dann sparst Du Dir auch gleich die doppelten Zuweisungen von buch und heft. Allerdings finde ich Deine Benamung ein wenig unglüclich. Eine Sache "ist eine" Tasche in Deinem Modell. Hier erwarte ich allerdings eigentlich eine Spezialisierung, z.B. eine Handtasche "ist eine" Tasche. Das ist eine korrekte Vererbung. Semantisch macht in meinen Augen eher der umgekehrte Fall Sinn. Eine Tasche "ist eine" Sache. Aber das ist schon OOAD. Schöne Grüße, Peter Zitieren
TDM Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 erm... Etwas unlogisch. Sache erbt von Tasche und besitzt eine Tasche. Wenn eine Sache in Tasche ist, dann ist das für mich Komposition (evtl. auch Aggregation) aber nie Generalisierung. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.