clone Funktion ableiten.



  • Hallo.

    Ich habe eine abstrakte Klasse (WorldObject) :

    public abstract class WorldObject  {
    
    	public WorldPlayer player1	= null;
    	public WorldPlayer player2	= null;
    
    	public static final int GoodAction	= Integer.MAX_VALUE - 1;
    	public static final int BadAction	= Integer.MIN_VALUE + 1; 
    
    	public abstract WorldObject clone();
    
    	public abstract WorldPlayerColor getWorldValueAt(int xPosition, int yPosition);
    
    	protected abstract boolean setWorldValueAt(int xPosition, int yPosition, WorldPlayerColor value);
    
    	public abstract WorldPlayerColor getWorldWinner();
    
    	public abstract boolean isWorldOver();
    
    	public abstract boolean executeWorldAction(WorldAction action);
    
    	public abstract WorldAction[] getNextWorldAction();
    
    	public abstract void printWorldObject();
    

    Außerdem habe ich eine zweite Klasse, die eine Kindklasse ist (THreeWinWorld).
    Des Weiteren habe ich noch eine dritte Klasse (ThreeWinPlayer), die aber nicht von WorldObject abgeleitet ist, jedoch ein WorldObject beihnaltet.

    So nun zu meinem Problem. In der klasse ThreeWinPlayer gibt es eine Methode, die ein WorldObject übergeben bekommt. Nun wird von diesem Object die clone Funktion aufgerufen. Da die Klasse WorldObject abstract ist, übergebe ich der Funktion ein ThreeWInObject. Nun dachte ich, wenn ich die clone Funktion aufrufe, wird die Funktion des Kind objectes aufgerufen. Aber das ist leider nicht der Fall. Kann mir das jemand erklären.

    Also noch mal kurz zusammengefasst :
    Ich habe eine Funkion und übergebe dieser Funktion (in der ParameterListe steht WorldObject) ein WorldObject(ein abgeleitetes, da WorldObject abstract ist. Danach rufe ich die clone Funktion von diesem Object auf.

    Es wird jedoch nicht die clone Funktion des Kindes aufgerufen ! Wieso nicht ??



  • habe unsinn geschrieben 😉



  • jetzt aber..

    schau dir mal an, wie man eine eigene clone Methode implementiert
    http://www.iks.hs-merseburg.de/~uschroet/Literatur/Java_Lit/JAVA_Insel/javainsel_10_002.htm



  • Fischkopf2009 schrieb:

    Danach rufe ich die clone Funktion von diesem Object auf.

    Es wird jedoch nicht die clone Funktion des Kindes aufgerufen !

    Aha, welche denn sonst?

    PS: Es gibt in Java keine "Funktionen", also bitte verwende den Begriff nicht dauernd, davon krieg ich Augenkrebs...



  • Okay passt auf :

    Hier ist der Code der "Porbleme" macht :

    /* private class to create a search tree */
    	private class WorldSearchNode{
    
    		private WorldObject nodeWorld	= null;
    		private WorldAction nodeAction	= null;
    		private int depth				= -1;
    		private int maxDepth			= -1;
    		private int nodeValue			= 0;
    
    		public WorldSearchNode(WorldObject world, WorldAction action, int depth, int maxDepth){
    			this.nodeWorld	= world.clone();
    			this.nodeAction	= action;
    			this.maxDepth	= maxDepth;
    			this.depth		= depth;
    
    			/* if possible execute action */
    			if (action != null){
    				nodeWorld.executeWorldAction(nodeAction);			
    			}		
    
    			if (depth % 2 == 0){
    				/* set the node value for max player */
    				nodeValue	= Integer.MIN_VALUE;
    			}else{
    				/* set the node value for min player */
    				nodeValue	= Integer.MAX_VALUE;
    			}			
    		}
    

    Wie zu sehen ist wird der Klasse im Konstruktor ein WorldObject übergeben. Im Konstruktor wird dann die clone Methode aufgerufen .

    Hier ein Auszug aus der ThreeWinWOrld :

    public class ThreeWinObject extends WorldObject {
    
    	public static final int xMax			= 3;
    	public static final int yMax			= 3;
    
    	private WorldPlayerColor playingField[][] 	= new WorldPlayerColor[xMax][yMax];
    
    	public void startGame(){
    		for (int x = 0; x < xMax; x++){
    			for (int y = 0; y < yMax; y++){
    				playingField[x][y] 	=  WorldPlayerColor.NoPlayer;			
    			}
    		}
    
    		if (player1.isStartPlayer()){
    			player1.setStartPlayer(false);
    			player1.setPlayerState(WorldPlayerState.InActive);
    
    			player2.setStartPlayer(true);
    			player2.setPlayerState(WorldPlayerState.Active);
    		}else{
    			player2.setStartPlayer(false);
    			player2.setPlayerState(WorldPlayerState.InActive);
    
    			player1.setStartPlayer(true);
    			player1.setPlayerState(WorldPlayerState.Active);
    		}
    	}
    
    	@Override
    	public WorldObject clone() {
    		System.out.println("Hier fehlt noch was !!!");
    		return null;
    	}
    

    Die Ausgabe "Hier fehl noch was" kommt aber einfach nicht. Was mich zu dem Schluss kommen lässt, dass hier nicht die clone Funktion der Klasse ThreeWInWolrd aufgerufen wird.

    Aber warum nicht ??



  • Ich lehn mich mal aus dem Fenster und sage: Dein Problem liegt woanders.



  • Aber wo ?

    In der Basisklasse habe ich die abstracte Methode clone, die in der Kindklasse überschrieben wird. Soweit alles gut.
    Bei einem Methodenaufruf, wo als Argument die Basisklasse steht jedoch ein Kindklassen Objekt übergeben wird, wird nicht die Methode der Kindklasse aufgerufen, sondern die der Vaterklasse .



  • Fischkopf2009 schrieb:

    Aber wo ?

    Da, wo WorldSearchNode nicht mit einem ThreeWinObject instanziiert wird.

    Bei einem Methodenaufruf, wo als Argument die Basisklasse steht jedoch ein Kindklassen Objekt übergeben wird, wird nicht die Methode der Kindklasse aufgerufen, sondern die der Vaterklasse .

    Blödsinn, wenn die Vaterklasse WorldObject ist existiert dort gar keine clone() methode die aufgerufen werden könnte. Oder wie willst du das festgestellt haben? Rumraten hilft beim Programmieren nicht.

    Im Übrigens wirst du hierwegen zumindest von meiner Seite aus auf hilfreiche Antworten verzichten müssen:

    Fischkopf2009 schrieb:

    Da lese ich immer nach, wenn das forum keine antwort hat 😉


Log in to reply