kostenloser Webspace werbefrei: lima-city


Objekte und Vererbung

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    ho ;)

    Ich habe eine Frage an diejenigen, die sich mit OOP in Java -> Android App (aber auch grundsätzlich) auskennen...

    Hier ist mein Problem:
    Ein Spiel besteht aus 3 Klassen: A, B, C

    A ist die oberste Klasse (Main Funktion sozusagen), und legt die Objekte b = new B(); und c = new C(); an.
    B erbt von A und verwaltet die Spielstände, unter anderem in einem Array. Mit Setter und Getter Methoden kann man auf die aktuellen Spielstände zugreifen.
    z.B. getX(); // <- Methode in B
    b.getX(); // <- Aufruf von Objekt b aus A um Spielstand zu ermitteln
    C erbt ebenfalls von A und stellt die Künstliche Intelligenz dar. (Bei einem Rundenbasierendem Spiel wird nach jedem Spielzug des Users ein Zug der KI ausgeführt.) Diese programmiere ich gerade, und genau hier habe ich ein Problem. Innerhalb von C will ich auf die Methoden von A zugreifen, und gleichzeitig den Spielstand abfragen können, also z.B. b.getX();

    Mein Problem ist, dass das Spiel abstürzt, sobald die KI (C) anfängt, entweder Methoden von A, und / oder B aufzurufen. (Wobei B nur indirekt über A benützt wird. Das Objekt b mit den bestehenden Spielständen wird schließlich auch geerbt, und soll auch von der KI gelesen und beschrieben werden können.)
    Innerhalb von Eclipse werden mir keine Fehler oder Warnungen angezeigt, also müsste mein Code von der Syntax her stimmen...

    Ich kann in C mit den Objekten A und B arbeiten, wenn ich sie neu initialisiere.
    z.B. innerhalb von C: c_b = new B();
    Allerdings nützt mir das nichts, weil ich die Spielstände aus dem in A angelegtem Objekt b brauche...

    *Knoten in der Zunge hab* ^^
    Könnt ihr mir folgen?
    Hat jemand Erfahrung damit und eine Vermutung, warum mein Programm abstürzt?
    Habe ich irgendetwas mit der Vererbung missverstanden und funktioniert das nicht so, wie ich mir das vorstelle? (Bin noch nicht so erfahren mit OOP.)

    lg und danke im voraus
    Sincer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Nuja, ich bin beim Java lernen und behaupte keineswegs, dass ich es kann, also nimm es mir bitte nicht übel, wenn ich Scheiße erzähle.

    Du musst die Variablen, in denen du die Referenzen auf die Objekte A und B speicherst, entweder so initialisieren, dass sie überall (global) gültig sind, oder die Referenzen der Objekte per Parameter an den Konstruktor der Klasse C übergeben, so, dass die Referenzen auf Objekt A und B Eigenschaften von dem fertigen Objekt C werden.

    Ich mache dir das mal als Code-Beispiel:
    class C
    {
    	A a;
    	B b;
    	
    	C(A ref_a, B ref_b) // Konstruktor von C, der muss den selben Namen
    	{ 		    // wie die Klasse C haben
    		a = ref_a;
    		b = ref_b;
    	}
    	
    	// Beispielmethode
    	void beispielmethode()
    	{
    		System.out.println(b.getX());
    	}
    }
  4. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    ho ;)

    Vielen Dank für die schnelle Antwort, du hast damit 50% meines Problems gelöst :D

    Ich finde es eigenartig, mein B Objekt b ist public und sollte daher ja ganz normal vererbt werden können :/
    Das ganze als Parameter zu übergeben funktioniert aber soweit :P

    Die A klasse ist aber die main Funktionion, also wird nicht als Objekt a angelegt. Oder anders gesagt, ich kann es nicht als Parameter übergeben...

    In Code sieht das so aus:
    class A
    {
    	public B b = new B();
    	public C c = new C();
    
    	public int funktionA()
    	{
    		// macht etwas, dass auch in C benörtigt wird...
    		return data;
    	}
    
    	public void funktionSpiel()	// Die Main Methode, die so lange läuft, wie das Spiel läuft.
    	{
    		// ...
    		if(b.funktionB() == 1)	// Hier wird ein Wert vom Spielstand der Klasse B überprüft...
    			c.test(b);
    		// ...
    	}
    }
    
    class B extends A
    {
    	private int[] arrayB = new int[5];
    
    	funktionB() 
    	{
    		// überprüft irgendwas und speichert bestimmte Werte in ein private int Array...
    	}
    }
    
    class C extends A
    {
    	public void test(B b_ref)
    	{
    		/*
    		* Das funktioniert nun dank dir drafed-map :)
    		*/
    		if(b_ref.funktionB() == 1)	// Hier wird wieder ein Wert vom gleichen laufenden Spiel überprüft.
    		{
    			// aktion...
    		}
    
    		/*
    		* Und folgendes geht noch immer nicht :(
    		*/
    		int x = funktionA();		// Ruft eine Funktion von A auf, die eigentlich geerbt worden sein sollte :/
    	}
    }


    Ich kann die public funktionA() nicht als Parameter übergeben, da sie eine Methode von A ist. Meiner Meinung nach sollte ich sie aber benützen können, da sie schließlich von A geerbt wird...

    Hast du vielleicht noch eine Idee?

    Danke
    Sincer

    Beitrag zuletzt geändert: 7.9.2010 1:40:44 von sincer
  5. Brauchst du aus A nur Methoden, oder auch Eigenschaften / Werte von Variablen? Es ist nämlich so, dass du mit A garnicht mit einem Objekt arbeitest, sondern nur mit eine statischen Klasse. Du erzeugst ja nirgendwo ein Objekt, sondern fängst einfach in der Klasse an, zu programmieren. Erweiterst du A durch B, dann erbt B alle Methoden von A. Die Werte der Variablen, die du bis jetzt in A berechnet hast, jedoch nicht. Was du tun kannst ist folgendes: Lasse A garnicht als main laufen, sondern tue dies mit B. Dazu muss B aber statisch sein, du musst B aufrufen, nicht A (vom Betreibssystem aus in der VM) und du musst alle Berechnungen in B durchführen, nicht in A. Damit könntest du A eigentlich schon abstrakt machen, das musst du aber nicht.

    Wie gesagt, alles, was ich hier schreibe basiert auf Halbwissen, ich bin erst mitten in einem Tut.
  6. Also rein interesse halber:
    Hast du mal versucht vor funktionA() this zu schreiben:
    this.funktionA()
    Eventuell kann er einfach nicht einordnen welche funktionA er aufrufen soll, also die aus Klasse A oder die aus Klasse C.
    Ist nur eine Idee
  7. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    sektor schrieb:
    Hast du mal versucht vor funktionA() this zu schreiben:
    this.funktionA()


    Mit this.funktionA() innerhalb von C erreiche ich, dass eine Methode "funktionA()", die in C steht, aufrufe.
    In diesem Fall will ich aber die funktionA() aus A aufrufen.
    Aber wie gesagt, mit OOP habe ich nur wenig Erfahrung, also freue ich mich über eine Belehrung :)

    In diesem Fall existiert aber gar keine funktionA() in C, sondern nur in A, die ich eben zu C vererben und auch dort verwenden will.

    Aber um deine Frage zu beantworten: Ja, ich habs schon versucht xD

    drafed-map schrieb:
    Brauchst du aus A nur Methoden, oder auch Eigenschaften / Werte von Variablen? Es ist nämlich so, dass du mit A garnicht mit einem Objekt arbeitest, sondern nur mit eine statischen Klasse.

    Ich will von A sowohl Attribute (also globale / public Variablen) und die Methoden (also Funktionen in A)

    drafed-map schrieb:
    Du erzeugst ja nirgendwo ein Objekt, sondern fängst einfach in der Klasse an, zu programmieren. Erweiterst du A durch B, dann erbt B alle Methoden von A. Die Werte der Variablen, die du bis jetzt in A berechnet hast, jedoch nicht. Was du tun kannst ist folgendes: Lasse A garnicht als main laufen, sondern tue dies mit B. Dazu muss B aber statisch sein, du musst B aufrufen, nicht A (vom Betreibssystem aus in der VM) und du musst alle Berechnungen in B durchführen, nicht in A.

    Das habe ich auch schon bemerkt, deswegen übergebe ich die Werte, die ich in B brauche immer als Parameter, wie ich es jetzt auch mit dem Objekt b mache, wenn ich es in C brauche.

    Aber wenn ich z.B. in A nur stehen habe, dass eine Objekt b = new B(); erzeugt werden soll, und dann in B den Code schreibe, der jetzt in A steht, in C den Code schreibe, der gerade in B steht, und in D den Code schreibe, der gerade in C schreibt...
    Kann ich dann auch die Attribute vererben?

    Ganz abgesehen davon habe ich bis jetzt C nur als Testklasse geschrieben, die nur Methoden aus A und B verwenden will, und noch gar nicht auf deren Attribute (außer über Setter und Getter) zugreift. Und diese müssten sich doch ganz normal vererben lassen.

    drafed-map schrieb:
    Damit könntest du A eigentlich schon abstrakt machen, das musst du aber nicht.

    Um ehrlich zu sein, weiß ich gar nicht, was eine Abstrakte Klasse genau ist.

    lg und danke weiterhin für Antworten
    Sincer
  8. Moin,

    sincer schrieb:Mit this.funktionA() innerhalb von C erreiche ich, dass eine Methode "funktionA()", die in C steht, aufrufe.
    In diesem Fall will ich aber die funktionA() aus A aufrufen.
    Aber wie gesagt, mit OOP habe ich nur wenig Erfahrung, also freue ich mich über eine Belehrung :)

    In diesem Fall existiert aber gar keine funktionA() in C, sondern nur in A, die ich eben zu C vererben und auch dort verwenden will.

    also wenn Du sagst, dass C keine funktionA() beinhaltet, Du diese jedoch aufrufen kannst, dann wird sie auf jeden Fall von Klasse A vererbt.
    Dasselbe gilt auch für Attribute - sofern Sie denn einen zugänglichen Modifier besitzen.
    Ich habe das gerade nochmal ausgiebig getestet und es funktoniert problemlos.
    Wenn Du jedoch ein neues Objekt erstellst, werden wie drafed-map schon ansprach, alle Attribute in den Ausgangszustand versetzt, wie er in der Klasse A explizit dargestellt ist.
    Notgedrungen könntest Du von Deiner problematischen Klasse ein Singleton aufbauen, um es für Testzwecke eindeutig zu halten.

    Aber an und für sich verstehe ich das Problem immernoch nicht wirklich, da zuviel Code fehlt.
    Das Beispiel aus Deinem zweiten Beitrag habe ich problemlos ausführen können ... sei es mit Parameterübergabe (was Du ja bereits gelöst hast) oder Aufruf der vererbten Methoden.

    Es wäre sicherlich sinnvoller, wenn Du uns alle 3 Klassen einmal komplett gibst, damit man sich auf die Fehlersuche begeben kann.
    Weil diese unendlichen Romane über ein Problem ohne den Lösungsansatz durchzusetzen nicht gerade produktiv sind.

    Gruß,
    Pawnee

    Beitrag zuletzt geändert: 8.9.2010 8:35:49 von pawnee
  9. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    pawnee schrieb:
    also wenn Du sagst, dass C keine funktionA() beinhaltet, Du diese jedoch aufrufen kannst, dann wird sie auf jeden Fall von Klasse A vererbt.
    Dasselbe gilt auch für Attribute - sofern Sie denn einen zugänglichen Modifier besitzen.

    Genau hier ist das Problem: Ich kann funktionA() in C nicht direkt aufrufen.
    Ich arbeite mit Eclipse, Syntaxfehler werden mir also sofort angezeigt. In diesem Fall ist es syntaktisch richtig, allerdings stürzt das Programm ab, wenn die funktionA() in C aufgerufen werden soll. Wenn ich den Aufruf von funktionA() aus C auskommentiere, stürzt das Programm nicht mehr ab. Es macht dann halt nicht das, was es soll :P

    pawnee schrieb:
    Ich habe das gerade nochmal ausgiebig getestet und es funktoniert problemlos.

    Das sollte es meiner Meinung nach auch :/

    pawnee schrieb:
    Wenn Du jedoch ein neues Objekt erstellst, werden wie drafed-map schon ansprach, alle Attribute in den Ausgangszustand versetzt, wie er in der Klasse A explizit dargestellt ist.
    Notgedrungen könntest Du von Deiner problematischen Klasse ein Singleton aufbauen, um es für Testzwecke eindeutig zu halten.

    Das wäre eine Lösung für das Objekt b... (Im Moment übergebe ich dieses Objekt einfach als Parameter und habe damit immer einen aktuellen Stand des Objekts...)

    pawnee schrieb:
    Es wäre sicherlich sinnvoller, wenn Du uns alle 3 Klassen einmal komplett gibst, damit man sich auf die Fehlersuche begeben kann.

    Bekommst eine PN

    lg && danke ;)
    Sincer
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!