2017-03-13 3 views
1

私はJavaとオブジェクト指向を初めて熟知しています。別のクラスのフィールドとメソッドを取得する

私はEnv3Dを使用して水族館を作って、私はSimulationクラス、Tokenクラス、Fishクラスのを持っているSOLID

の原則を適用したいしています。

私のTokenクラスは現在、魚の生成とその動作を扱っています。 理想的には、この動作をTokenクラスとは別のクラスにします。

Fishは私が知っているTokenBehaviorの2つのクラスを拡張する必要があります。

どうすればよいですか? FishBehaviorインターフェイスを実装できますが、Behaviorクラスのフィールドとメソッドはどのように取得されますか?

トークンクラス

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クラス

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

'Behavior'が魚の動き(例えば動き方)を定義していると仮定すると、論理的なアプローチは' Behavior'を別のクラスとして残し、 'Fish'に' setBehavior'のようなメソッドを持たせることです。 [Visitor-pattern](https://en.wikipedia.org/wiki/Visitor_pattern)を参照してください。 「行動」の実際のコードを見ることなく、わかりにくい。 – Paul

+0

"私のトークンクラスは現在、魚の生成とその振る舞いを扱っています"これがあなたの目標なら、なぜ魚がこれらのクラスを拡張すべきかわかりません。その振る舞いは、魚クラス(クラス変数として)を構成することができ、 'Token'はそれぞれの' Fish'を作成し、それに対応する振る舞いを渡すべきです。 – moondaisy

答えて

0

TokenあなたFishクラスがTokenBehaviorの両方からオブジェクトを継承しますのでFishは、Tokenを拡張する必要があり、その後、Behaviorを拡張してもらいます。これが最良の方法ですあなたの状況での複数の継承問題を回避してください。

代わりに、Tokenクラスは変数宣言とそれぞれのゲッターとセッターのように見えるので、Tokenをインターフェイスにするのは苦痛ではないでしょう。

0

ソリューションの設計を行うには、「継承上の合成」の原則を考慮する必要があります(コード例については、wikipediaを参照してください)。

あなたの問題を理解している場合、Fishはトークンです、私は同意します。 しかし、魚は行動ではなく、魚には行動があります。 そして、あなたはそれからメソッドを呼び出して、行動の対象としてトークンの属性を集計する必要があり、など

また、具体的なクラス(のはBehaviour1、Behaviour2を言わせて)によって実装されたインタフェース、と行動を定義することによって、抽象化の別のレベルを追加することができます。 Behaviour1またはBehaviour2実装を戻すメソッドによってFishクラスでオーバーライドされたTokenクラスの抽象的なgetBehaviour()メソッドを使用して、Tokenクラスによってビヘイビアオブジェクトにアクセスできます。

関連する問題