我正在写一个Ray Tracer,我有一个Vec3类,它是一个典型的数学向量,有3个坐标:X,Y和Z.我还创建了一个Color类,它包含3个组件:R,G,编写了相当数量的代码后,我开始注意到Color基本上是Vec3。我开始为Vec3编写许多与Color相同的方法。看到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已经有一段时间了。所以,我对这个问题的第一直觉答案是否。
答案 0 :(得分:0)
我不是百分之百确定你所问的是什么,但如果你的代码就像你所展示的那样,那么你不能拥有你想要的东西吗?在您的代码中Color extends Vec3
。
由于此声明,Color
对象可被视为Vec3
对象; Vec3的所有方法都由Color继承,方法采用Vec3类型的arg将接受Color类型的args。
答案 1 :(得分:0)
每个基元都有相应的类。例如,Integer
为int
。 Java可以自动装箱,即自动转换它们。
但是,我不认为在这种情况下使用继承是合适的。如果Vec3
实施发生变化怎么办?如果您决定让您的会员成为私人(如您所愿),该怎么办?
答案 2 :(得分:0)
编辑 - 我最后看到你对泛型的评论。这不是autoboxing的用途吗?
难道你不能只使用这样的通用吗?
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; }
}