OOP Funktion in Subklasse aufrufen

donnar

Mitglied
Hallo,

ich arbeite zur Zeit an zwei Klassen, die miteinander in Beziehung stehen.
[JAVA=42]
public class Generator extends PApplet {
//...
public void ausfuehren(){
Vektor vObj = new Vektor();
vObj.zeichne();
}
//...
}

public class Vektor extends Generator {
//....
public void zeichne() {
line(0.0, 0.0, 10.0, 10.0);
}
//...
}
[/code]
PApplet wird von der Processing Bibliothek zur Verfügung gestellt (Processing 1.0). Wenn ich die Methode "zeichne()" in der Klasse "Generator" stehen habe und ausführen möchte, funktioniert dies ohne Probleme. Wenn ich die Methode so wie im Code stehend aus der Klasse Vektor starte, entsteht eine "NullPointerException" für "processing.core.PApplet.lerpColor".

Was muss ich umschreiben, damit ich die Funktion "line()" auch in der Klasse "Vektor" aufrufen kann?
 
schade dass du die Methode line() nicht postest oder näher auf die NullPointerException eingehst

das Ursprungs-Generator-Objekt wird sicher speziell von außen initialisiert,
etwa wenn es ein richtiges Applet ist vom Browser aus,
Parameter im Konstruktor, init-Methoden usw.

bei new Vektor() passiert nix weiter, da fehlt dann vielleicht etwas
 
Hier nochmal die erweiterte Fehlermeldung:
Exception in thread "Animation Thread" java.lang.NullPointerException
at processing.core.PApplet.line(PApplet.java:7100)
at Vektor.zeichne(Vektor.java:103)

Die Methode "line(x1,y1,x2,y2)" zeichnet eine Linie (siehe: line() \ Language (API) \ Processing 1.0 und PApplet) und wird in der Klasse PApplet definiert.

Wie bereits erwähnt funktioniert die Methode "line()" in der Klasse Generator, aber nicht in der Klasse Vektor.
Liegt es daran, dass nur die Klasse Generator von PApplet extended? Müsste die Klasse Vektor dadurch nicht die selben Methoden besitzen, wie die Klasse Generator?
 
Hm und noch was. Ist das nicht eine Zirkuläre Abhängigkeit?

Die Klasse Generator kennt die Unterklasse Vektor. Vektor kann man nicht ohne Generator und Generator nicht ohne Vektor kompilieren. Oder sehe ich das falsch?
 
> Müsste die Klasse Vektor dadurch nicht die selben Methoden besitzen, wie die Klasse Generator?

klar hat sie dieselben Methoden, sonst gäbe es auch Fehlermeldungen wie 'Methode nicht gefunden',
aber gleiche Methoden reicht nicht immer,
ob eine Methode auch zufriedenstellend ausgeführt wird hängt noch von drei anderen Dingen ab:
1. den Zustand des restlichen Gesamtprogramms, hier eher irrevant
2. die Parameter der Methode, dürften hier in Ordnung sein
3. und ganz wichtig wie schon in der ersten Antwort geschrieben: der ZUSTAND des Objektes, intern gesetzte Attribute, auf die in den Methoden zugegriffen wird

das erste Generator-Objekt ist initialisiert, das zweite Vector-Objekt (auch ein Generator-Objekt) nicht, so meine Vermutung


Beispiel:
Java:
public class Test {
    public static void main(String[] args)   {
        A a = new A();
        a.info = "Test";
        a.x(); // funktioniert

        B b = new B();
        b.x(); // NullPointerException, info nicht gesetzt
    }
}
class A{
    String info;
    public void x() {
        System.out.println("info sub: " + info.substring(2));
    }
}
class B extends A {
}
 
Zuletzt bearbeitet von einem Moderator:
>>Ist das nicht eine Zirkuläre Abhängigkeit?
Ja.

>>das erste Generator-Objekt ist initialisiert, das zweite Vector-Objekt (auch ein Generator-Objekt) nicht, so meine Vermutung
Ich verstehe dein Beispiel, kann es aber nicht auf mein aktuelles Projekt anwenden. Ich musste bisher kein Objekt line() initialisieren und konnte einfach darauf zugreifen.
 
tja, hängt alles vom Gesamtprogramm ab, poste doch bisschen mehr Code

hier noch ein Zitat vom Link
PApplet
oben Beschreibung eines Beispiels:
PApplet embed = new Embedded();
add(embed, BorderLayout.CENTER);

// important to call this whenever embedding a PApplet.
// It ensures that the animation thread is started and
// that other internal variables are properly set.
embed.init();

--------

du könntest grundsätzlich deine Subklassen nicht von PApplet erben lassen sondern das Generator-Objekt im Konstruktor übergeben,

zeichne() sieht dann so aus:
Java:
public void zeichne() {
   this.gen.line(..);
}
gen als Klassenattribut
 
Zuletzt bearbeitet von einem Moderator:
Hm und noch was. Ist das nicht eine Zirkuläre Abhängigkeit?

Die Klasse Generator kennt die Unterklasse Vektor. Vektor kann man nicht ohne Generator und Generator nicht ohne Vektor kompilieren. Oder sehe ich das falsch?

Das bekommt der Compiler schon hin

Java:
public class B {
  private A a;
  public void setA(A a){
	  this.a = a;
  }
  public String toString(){
	  return "B";
  }
}

Java:
public class A {
  private B b;
  
  public void setB(B b){
	  this.b = b;
  }
  public String toString(){
	  return "A";
  }
}

Java:
public class Test {
	public static void main(String[] arg){
		A a = new A();
		B b = new B();
		a.setB(b);
		b.setA(a);
		System.out.println(a);
		System.out.println(b);
	}
}
 
Und warum nicht? Hierachische Domänen sind zwar in Westeuropa normalerweise vorherrschend aber es gibt bestimmt auch Anwendungsgebiete für soetwas.

Henne - Ei 😉

Java:
Henne a = new Henne("Rosi");
Ei e = a.legeEi();
Henne b = e.schluepfeHenne("Froni");
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank an die vielen Antworten. Leider konnte ich auch damit nicht viel anfangen...ich habe jedoch einen anderen Weg gefunden:
[JAVA=42]
public class Generator extends PApplet {
//...
public void ausfuehren(){
Vektor vObj = new Vektor();
vObj.zeichne();
}
//...

class Vektor {
//....
public void zeichne() {
line(0.0, 0.0, 10.0, 10.0);
}
//...
}
}
[/code]

Damit kann ich endlich auf die Methode line zugreifen.
 

Neue Themen


Zurück
Oben