2017-03-13 4 views
1

Ich bin neu in Java und Objektorientierung so entschuldigt, wenn ich nicht klar bin.Abrufen von Feldern und Methoden aus einer anderen Klasse

Ich habe ein Aquarium mit Env3D gemacht und die Grundsätze der SOLID

Ich habe eine Simulation Klasse anwenden möchten, Token Klasse, Fish Class.

Meine Klasse Token befasst sich derzeit mit der Erzeugung der Fische und deren Verhalten. Idealistisch möchte ich, dass das Verhalten eine separate Klasse von der Klasse Token ist.

Ich würde meine Fish brauchen, um zwei Klassen zu erweitern, Token und Behavior die ich weiß, ist nicht möglich.

Wie würde ich das tun? Die Fish könnte eine Behavior Schnittstelle implementieren, aber wie würde es die Felder und Methoden aus der Behavior Klasse bekommen?

Token Klasse

package UserCode; 

/** 
* It's a Token! 
* 
* @author (Tom) 
* @version (02.03.2017) 
*/ 
public class Token 
{ 

// Env3d-defined object-specific fields: 
// Reference to the 3D model, called 'model': 
String model; 

// Reference to texture-map, called 'texture': 
String texture; 

// Scale factor applied to model: 
double scale; 

// Position in 3D world (x,y,z coordinates): 
double x; 

// Position in 3D world (x,y,z coordinates): 
double y; 

// Position in 3D world (x,y,z coordinates): 
double z; 

// Orientation (about x,y,z): 
double rotateX; 

// Orientation (about x,y,z): 
double rotateY; 

// Orientation (about x,y,z): 
double rotateZ; 

// Set transparency to true: 
boolean transparent=true; 


public void setModel(String model){ 
    this.model = model; 
} 

public void setScale(double scale){ 
    this.scale = scale; 
} 

public void setTexture(String texture){ 
    this.texture = texture; 
} 

public void move() 
{ 
    // rotate about y axis 
    //rotateY += 1; 
} 



public void setOrientationX(double x) 
{ 
    // set position 
    this.rotateX = x; 
} 

public void setOrientationY(double y) 
{ 
    // set position 
    this.rotateY = y; 
} 

public void setOrientationZ(double z) 
{ 
    // set position 
    this.rotateZ = z; 
} 





public void setPositionX(double x) 
{ 
    // set position 
    this.x = x; 
} 

public void setPositionY(double y) 
{ 
    // set position 
    this.y = y; 
} 

public void setPositionZ(double z) 
{ 
    // set position 
    this.z = z; 
} 
} 

JavaFish Klasse

package UserCode; 

/** 
* <h1>Aquarium: JavaFish</h1> 
* <p>This class generates and controls the JavaFish in the Aquarium. 
* <p>The characteristics of the JavaFish are to swim horizontelly, backwards and forwards. 
* 
*@version 1.0.0 
*@author Tom 
*/ 

public class JavaFish extends Token 
{ 
private double _xspeed = 0.08; 

/** 
* Creates the JavaFish and initilises instance/object variables of images of JavaFish and Aquarium. 
* The second initilises position and orientation. These come from the  Framework package. 
*/ 

public JavaFish() 
{ 
    setModel("models/billboard/billboard.obj"); 
    setScale(0.5); 
    setTexture("textures/javaFish/JavaFish.png"); 


    setPositionX(1.0); 
    setPositionY(5.0); 
    setPositionZ(1.0); 

    setOrientationX(0); 
    setOrientationY(-90); 
    setOrientationZ(0); 
} 

public void move() 
{ 
    // JavaFish x-axis assigned to move forwards (+=) by instance varible in constructor 
    x += _xspeed; 

    // Flip JavaFish orientation and change direction if fish reaches specific x-axis point 
    if (x < 2) 
    { 
     _xspeed = 0.05; 
     setOrientationY(-90); 
    } else if (x > 8){ 
     _xspeed = -0.05; 
     setOrientationY(90); 
    } 
} 
} 
+0

Angenommen, 'Behaviour' definiert das Verhalten des Fisches (z. B. wie es sich bewegt), wäre der logische Ansatz,' Behaviour' als separate Klasse zu belassen und eine Methode wie 'setBehavior' in' Fish' zu haben. Siehe [Besuchermuster] (https://en.wikipedia.org/wiki/Visitor_pattern). Schwer zu sagen, ohne den eigentlichen Code von 'Behaviour' zu sehen. – Paul

+0

"Meine Token-Klasse beschäftigt sich derzeit mit dem Erzeugen des Fisches und deren Verhalten", wenn das Ihr Ziel ist, dann sehe ich nicht, warum 'Fish' irgendwelche dieser Klassen erweitern sollte. Das Verhalten könnte die Fischklasse (als Klassenvariable) bilden und "Token" sollte jeden "Fisch" erzeugen und ihm sein entsprechendes Verhalten übergeben. – moondaisy

Antwort

0

Haben TokenBehavior verlängern, dann FishToken verlängern haben, so dass Ihre Fish Klasse wird sowohl erben Objekte aus Token und Behavior. Dies ist der beste Weg, um zu bekommen um das Problem der Mehrfachvererbung in Ihrer Situation.

Als eine Alternative, Ihre Token Klasse scheint nur Variable Deklarationen und ihre jeweiligen Getter und Setter zu sein, so wäre es wahrscheinlich nicht zu viel Mühe, Token eine Schnittstelle zu machen.

0

Um das Design Ihrer Lösung zu erreichen, sollten Sie das Prinzip "Zusammensetzung über Vererbung" beachten (siehe Wikipedia für Codebeispiele).

Wenn ich dein Problem verstehe, ist Fisch ein Token, ich stimme zu. Fisch ist jedoch kein Verhalten, Fisch hat ein Verhalten. Dann sollten Sie Verhalten Objekt als Token-Attribut aggregieren, Methoden von ihm fordern, usw.

Sie können auch durch die Definition des Verhaltens als Schnittstelle, implementiert durch konkrete Klassen eine weitere Abstraktionsebene hinzufügen (sagen wir mal Behaviour1, Behaviour2). Auf Verhaltensobjekte kann mit einer zusätzlichen abstrakten Methode getBehaviour() in der Klasse Token zugegriffen werden, die in der Klasse Fish durch die Methode Behaviour1 oder Behaviour2 zurückgegeben wird.

Verwandte Themen