Получение полей и методов из другого класса

Я новичок в Java и объектной ориентации, поэтому извиняюсь, если я не понимаю.

Я сделал аквариум с помощью Env3D и хочу применить принципы SOLID.

У меня есть Simulation класс, Token класс, Fish класс.

Мой класс Token в настоящее время занимается созданием рыб и их поведением. В идеале я хочу, чтобы поведение было отдельным классом от класса Token.

Мне понадобится мой Fish для расширения двух классов, Token и Behavior, что, как я знаю, невозможно.

Как мне это сделать? Fish может реализовать интерфейс Behavior, но как он получит поля и методы из класса 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);
    } 
}
}

person Tom Sheppard    schedule 13.03.2017    source источник
comment
Предполагая, что Behavior определяет поведение рыбы (например, как она движется), логическим подходом было бы оставить Behavior как отдельный класс и иметь такой метод, как setBehavior в Fish. См. шаблон посетителя. Трудно сказать, не видя фактического кода Behavior.   -  person Paul    schedule 13.03.2017
comment
Мой класс Token в настоящее время занимается генерацией рыб и их поведением, если это ваша цель, тогда я не понимаю, почему Fish должен расширять любой из этих классов. Поведение может составлять класс рыбы (как переменную класса), и Token должен создавать каждый Fish и передавать ему соответствующее поведение.   -  person moondaisy    schedule 13.03.2017


Ответы (2)


Попросите Token расширить Behavior, а затем Fish расширить Token, чтобы ваш Fish класс унаследовал объекты как от Token, так и от Behavior. Это лучший способ обойти проблему множественного наследования в вашей ситуации.

В качестве альтернативы ваш Token класс выглядит просто объявлениями переменных и их соответствующими геттерами и сеттерами, поэтому, вероятно, не составит большого труда сделать Token интерфейс.

person Alex Quilliam    schedule 13.03.2017

Для достижения дизайна вашего решения вы должны учитывать принцип «композиция важнее наследования» (примеры кода см. В Википедии).

Если я понимаю вашу проблему, рыба - это жетон, я согласен. Однако Рыба - это не поведение, у рыбы есть поведение. Затем следует агрегировать объект Behavior как атрибут Token, вызывать из него методы и т. Д.

Вы также можете добавить еще один уровень абстракции, определив Behavior как интерфейс, реализованный конкретными классами (скажем, Behaviour1, Behaviour2). Доступ к объектам поведения можно получить из класса Token с помощью дополнительного абстрактного метода getBehaviour () в классе Token, переопределенного в классе Fish методом, возвращающим реализации Behaviour1 или Behaviour2.

person Benjamin Caure    schedule 13.03.2017