Konstruktoren bei Vererbung

  • Themenstarter Themenstarter lebesgue
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

lebesgue

Gast
Hallo ihr Lieben,

ich habe eine Klasse Punkt:
Code:
public class Punkt {

	private double x;
	private double y;
	
   public Punkt(double x, double y) {
		this.x = x;
		this.y = y;
	}
	
   public Punkt add(Punkt b) {
		return new Punkt(x + b.x, y + b.y);
	}

	public Punkt sub(Punkt b) {
		return new Punkt(x - b.x, y - b.y);
	}
	
                ...
}

und eine Klasse Viereck:
Code:
public class Viereck {
	
   private Punkt a;
	private Punkt b;
	private Punkt c;
	private Punkt d;

	public Viereck(Punkt a, Punkt b, Punkt c, Punkt d) {
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
	}
                ...
		
}

Wenn ich jetzt z.B. eine Klasse Trapez ableiten möchte:
Code:
public class Trapez extends Viereck {

                Punkt p;
                double laenge_parallele1, laenge_parallele2, hoehe;

                public Trapez(Punkt p, double laenge_parallele1, double laenge_parallele2, double hoehe) {
                                ???
                }
}

Wie sieht dann der Rumpf für den Konstruktor der abgeleiteten Klasse aus?
Weil
Code:
super(p,parallele1,parallele2,hoehe);
geht ja nicht, weil parallele1,... ja keine Variablen vom Typ Punkt sind.
Ich weiß zwar, wie ich aus einem Anfangspunkt, den Längen der beiden Parallelen und der Höhe des Trapezes die 4 Eckpunkte des Trapezes berechnen kann, aber WIE übergeb ich die dem Konstruktor Trapez ???

Es wäre echt klasse, wenn mir das jemand erklären könnte. 🙂
 
Du musst sie irgentwie umrechnen, sodass du Point-Objekte per super( , , , ) übergibst. Wie genau ist eine mathematische Frage.
[/quote]
 
Verbrenn das am besten sofort. Der super Konstruktor muss das erste Statement im Konstruktor der Kind Klasse sein. Du müsstest in diesem Fall einige Berechnungen durchführen und dann noch neue Punkt Objekte anlegen und das alles in einem Statement. Sehr hässlich
 
wie wärs hiermit?

Code:
public static Trapez createInstance(Punkt p, double laenge_parallele1, double laenge_parallele2, double hoehe) {
     // deine Berechnungen
     return new Trapez( ... );
 }
                
public Trapez (Punkt a, Punkt b, Punkt c, Punkt d) { 
     super(a,b,c,d);}
 
Hallo zusammen ich hab eine ganz ähnliche frage.
und zwar wenn ich mich an diese schema halte und innerhalb von createinstance meine berechnungen durchführen möchte, bekomme ich beispielsweise wenn ich p.x angebe die rückmeldung das Punkt.x not visible ist.
wie kann ich stattdessen auf die variable zugreifen ?

Schandro Verfasst am: 08. 11. 2008, 8:29 Titel:

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

wie wärs hiermit?
Code:
 Code: 
 
 public static Trapez createInstance(Punkt p, double laenge_parallele1, double laenge_parallele2, double hoehe) { 
  // deine Berechnungen 
 return new Trapez( ... ); 
} 
                
public Trapez (Punkt a, Punkt b, Punkt c, Punkt d) { 
     super(a,b,c,d);}
[/quote]
 
entweder x public machen, was normalerweise eine schlechte Idee ist,
oder viel eher eine public Methode getX() anbieten und aufrufen, welche x zurückgibt,

noch viel eher nachdenken, ob überhaupt das x außerhalb des Punktes gebraucht wird
 
vielen dank für die schnelle antwort erstmal

fein das mit getX() hat schonmal gut funktioniert.. nun häng ich aber an der createInstance..

ohne createInstance wird konstruktor inder Oberklasse erkannt bekomme aber in der unterklasse die fehlermeldung super construcotr is undefined;

setze ich aber das createInstance bekomme ich in der Oberklasse die Rückmeldung dass der Konstruktor undefined ist
in der unterklasse sind dann allerdings keine fehler mehr..
was mache ich falsch ?
 
ich sehe zwar in den ersten Postings manche Hinweise, wie zwei grundlegend unterschiedliche Konstruktoren (4x Punkt vs Punkt + 3x double)
die teilweise in Ober- und Unterklassen definiert sind,
aber wie die vielen einzelnen Codeschnipsel mit deinem Problem verbunden sind kann ich spontan nicht erkennen und möchte ich gar nicht tiefer ergründen,

grundsätzlich kann eigentlich das Hinzufügen einer statischen Methode keine Konstruktor-Probleme erzeugen,
außer du meinst, dass in der statischen Methode der dort verwendete Konstruktor angestrichen wird,

erstelle dir erstmal die beiden Klassen wie sie sein sollen und ohne Compilerfehler,
danach dann die statische Methode, ab saubersten in einer dritten separaten Klasse,
dann postest du hier deinen aktuellen Code + Fehlermeldung + Zeile des Fehlers falls bekannt
 
punkt klasse bzw vecotrklasse ist schon vorgegeben;
ebenso in der testklasse der konstruktor aufruf
Code:
quadrangle = new Square(new Vec2D(100, 100), 200); //entweder hier fehler

nun soll in einer neuen klasse ein quadrat entwickelt werden
die klasse schaut bei mir folgendermaßen aus
Code:
public class Square extends Quadrangle {
	

	public static Square createInstance(Vec2D vec2D, int i){  //oder hier
      double x;
		double y;
		x=vec2D.getX();
		y=vec2D.getY();
		
		// Berechne Eckpunkte
		Vec2D h=new Vec2D(x,y);
		x=x+i;
		Vec2D j=new Vec2D(x,y);
		y=y+i;
		Vec2D k=new Vec2D(x,y);
		x=x-i;
		Vec2D l=new Vec2D(x,y);
		return new Square(h,j,k,l);
	}
	
	public Square(Vec2D a, Vec2D b, Vec2D c, Vec2D d) {
		super(a, b, c, d);
	
	}
}
wenn ich nun wie oben beschrieben in meiner klasse das create instance weg lasse .. dann stimmt zwar (logischerweise) der methodenaufruf der oberklasse, allerdings bekomme ich dann die fehlermeldung dass mein super konstruktor nicht "gesetzt" ist.
oder mache ich einen denkfehler und habe die oberen postings falsch verstanden?
 
von Vec2D und Quadrangle war bisher überhaupt nicht die Rede

wenn Square nur den Konstruktor mit 4x Vec2D hat und keinen anderen,
dann kann dein Aufruf

>quadrangle = new Square(new Vec2D(100, 100), 200);

nicht funktionieren, das ist doch klar? es muss ein Konstruktor passend zu den Parametern vorhanden sein,
Konstruktoren der Oberklasse werden nicht vererbt
 
Hänge auch seit Stunden hier fest 🙁

Verstehe nicht wie man aus den 4 Variablen den Konstruktor aufrufen kann, der als 1. Argument den super-konstruktor der oberklasse hat und andre variablentypen erwartet...

das umrechnen und referenzieren ist kein problem, nur das is so eklig...
 
wenn ein Konstruktor fehlt, dann muss man ihn definieren,

was genau der noch fehlende Square-Konstruktor für einen Aufruf

> new Square(new Vec2D(100, 100), 200);

machen soll, musst du ja wissen 😉

wenn die 200 für die Seitenlänge stehen soll, dann musst du wohl im Konstruktor die fehlenden drei Punkte ausrechnen,

das ist aber nicht so elegant, denn vor dem super--Aufruf darf man nicht besonders viel rechnen,
der super-Aufruf muss der erste Befehl im Konstruktor sein,
vielleicht musst du dann super mit Dummy-Punkten aufrufen, danach die richtigen Punkte ausrechnen und neu setzen,
nicht besonders schön,

besser wäre eine statische Methode, die die 4 Punkte ausrechnet und erst dann einen Konstruktor aufruft,

ich habe nun aber keine Lust mehr, für dich solche Gedanken aufzuschreiben,
wenn du nicht erklärst, welche Klassen du hast, welche Bedeutung die haben, warum du irgendwas aufrust usw,
worum es überhaupt geht, dann denke ich mir nicht weiter jedesmal 90% dazu
 
Empfehlung für alle die noch Probleme damit haben: macht keine static!
Es muss ausschließlich super() aufgefüllt werden. Es ist erschreckend einfach. Was genau in Super rein muss sag ich jetzt nicht, aber es ist wirklich nicht schwer, versucht einfach in Super die Vec2D's zu definieren, die Quadrangle übergeben werden müssen...
 
Antwort auf meine frage wäre
quadrangle = new Square.createInstance(new Vec2D(100, 100), 200);
als konstruktor aufruf gewesen ..
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben