Как конвертировать между "похожими" 3D-классами вектор в Java? - PullRequest
1 голос
/ 05 сентября 2011

Я пишу пакет geom как часть библиотеки Java, которая имеет свой собственный векторный класс:

package mypackage.geom;

public class Vector3D {
  public float x;
  public float y;
  public float z;

  public Vector3D(float x, float y, float z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  ...
}

Ожидается, что моя библиотека дополнит функциональность сторонней библиотеки, которая также реализует векторный класс, скажем, Vec3D. Класс Vec3D имеет те же поля (float x, float y и float z) и сигнатуры конструктора, что и мой класс Vector3D. Я просто хочу использовать сторонний векторный класс везде, где в моей библиотеке ожидается параметр Vector3D (например, предположим, у меня есть класс Camera, который имеет метод setPosition(Vector3D vector3D), и я хочу иметь возможность передавать Vec3D экземпляр к нему).

Это возможно в C ++. Например, можно объявить универсальный явный конструктор преобразователя из любого класса в Vector3D следующим образом:

template <class C>
explicit Vector3D(const C& c) : x(c[0]), y(c[1]), z(c[2]) {}

все, что для этого требуется, - это чтобы класс иностранца реализовал operator[]. Мне было интересно, как реализовать нечто подобное в Java, если это вообще возможно.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Есть несколько вариантов, и ни один из них не так хорош, как то, что вы показываете.Во-первых, конечно, вы можете написать явный конструктор:

Vector3d(Vec3d v) {this.x = v.x; this.y = v.y; this.z = v.z; }

Во-вторых, вы можете предоставить конструктор, который работает для любого векторного типа, который реализует интерфейс, который вы определили (назовите его «V»:)

Vector3d(V v) {this.x = v.getX(); this.y = v.getY(); this.z = v.getZ(); }

Конечно, вероятность того, что любая случайная вектороподобная вещь будет реализовывать V, в значительной степени равна 0, если вы не являетесь каким-либо органом стандартизации.

Вы также можете предоставитьконструктор, который принимает double[], при условии, что большинство таких типов будут обеспечивать метод toArray():

Vector3d(double[] v) {this.x = v[0]; this.y = v[1]; this.z = v[2]; }

Это позволит относительно легко преобразовать большинство других векторных классов в ваш, бездобавление пользовательского конструктора.

1 голос
/ 05 сентября 2011

Я думаю, это ближе всего к вашему конструктору конвертера из любого (неизвестного) класса:

public vec(Object any)
{
    try {
        x = any.getClass().getDeclaredField("x").getDouble(any);
        y = any.getClass().getDeclaredField("y").getDouble(any);
        z = any.getClass().getDeclaredField("z").getDouble(any);
    } catch ( Exception e ) {
        throw(new RuntimeException("vec cannot handle class in constructor: "+any.getClass(),e));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...