0

私はレイ トレーサーを作成しており、X、Y、Z の 3 つの座標を持つ典型的な数学ベクトルである Vec3 クラスを持っています。また、R、G、B の 3 つのコンポーネントを保持する Color クラスも作成しました。かなりの量のコードを書いた後、Color は基本的に Vec3 であることに気付き始めました。Vec3 で行ったのと同じように、Color についても同じメソッドをたくさん書き始めました。DRY コードが進むべき道であることを見て、2 つのクラスをマージしたかったので、両方のクラスに同じコードを書き続ける必要はありませんでした。

現状では、クラスは次のとおりです。

class Vec3{
    public static final int X=0,Y=1,Z=2;
    double components[];
    ...
    // Constructors and Methods
}

class Color extends Vec3{
    public static final int R=0,G=1,B=2;
    int components[];
    ...
    // Constructors and Methods
}

2 つのクラスの唯一の違いは、Vec3 はコンポーネントに double を使用し、Color は int を使用することです。データの種類を除けば、すべてのメソッドはまったく同じです。私の最初の傾向は、ジェネリック型 T の BaseVec3 クラスを作成してから、サブクラスで型を宣言することでした。しかしもちろん、ジェネリックにはプリミティブではなくクラスが必要です。

単一のメソッドコードベースを使用できますが、プリミティブデータ型が異なる方法はありますか?

編集:おそらく、私はしばらくPythonとCでプログラミングしており、Javaに触れてからしばらく経っていることに注意する必要があります。したがって、この質問に対する私の最初の直感的な答えはNOです。

4

3 に答える 3

0

編集 - 最後にジェネリックに関するコメントがあります。それがオートボクシングの目的ではありませんか?

このようなジェネリックを使用することはできませんか?

public abstract class GenericVector<T> {
    private final T x, y, z;

    public GenericVector(T x, T y, T z) {
        this.x=x;
        this.y=y;
        this.z=z;
    }

    public T getX() { return x; }
    public T getY() { return y; }
    public T getZ() { return z; }
}
于 2013-04-10T15:43:56.430 に答える