0

我正在编写一个 Ray Tracer,我有一个 Vec3 类,它是一个典型的数学向量,具有 3 个坐标:X、Y 和 Z。我还创建了一个包含 3 个组件的 Color 类:R、G 和 B。在写了相当多的代码之后,我开始注意到 Color 基本上是一个 Vec3。我开始为 Color 编写许多与 Vec3 相同的方法。看到 DRY 代码是可行的方法,我想合并这两个类,所以我不必为这两个类编写相同的代码。

就目前而言,这里是类:

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
}

这两个类之间的唯一区别是 Vec3 对其组件使用双精度,而 Color 使用整数。除了数据的类型,所有的方法都完全相同。我最初的想法是尝试创建一个泛型类型 T 的 BaseVec3 类,然后在子类中声明该类型。但是,当然,泛型需要一个类,而不是原语。

有什么方法可以让我拥有一个单一的方法代码库但具有不同的原始数据类型?

编辑:我可能应该注意到我已经用 Python 和 C 编程了一段时间,而且自从我接触 Java 以来已经有一段时间了。所以,我对这个问题的第一直觉回答是否定的。

4

3 回答 3

0

我不是 100% 确定你在问什么,但如果你的代码和你展示的一样,难道你没有你想要的吗?在您的代码中,Color extends Vec3. 由于这种说法,一个Color对象可以被视为一个Vec3对象;Vec3 的所有方法都由 Color 继承,采用 Vec3 类型的 arg 的方法将接受 Color 类型的 args。

于 2013-04-10T15:37:15.143 回答
0

每个原语都有其对应的类。例如,Integer对于int. Java 可以自动装箱,即自动转换它们。

但是,我认为在这种情况下使用继承是不合适的。如果您Vec3的实施发生变化怎么办?如果您决定将您的成员设为私有(您应该这样做)怎么办?

于 2013-04-10T15:38:09.870 回答
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 回答