[英]Java Subclasses that have different primitive data members, but same methods
我正在编写Ray Tracer,我有一个Vec3类,这是一个典型的数学向量,具有3个坐标:X,Y和Z。我还创建了一个Color类,其中包含3个分量: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以来已经有一段时间了。 因此,我对这个问题的第一个直觉答案是“ 否” 。
我不确定您要问什么,但是如果您的代码如您所显示的那样,我不是100%知道吗? 在您的代码中, Color extends Vec3
。 由于此声明,可以将Color
对象视为Vec3
对象。 Vec3中的所有方法均由Color继承,并且采用Vec3类型的arg的方法将接受Color类型的args。
每个原语都有其对应的类。 例如, Integer
for int
。 Java可以将它们自动装箱,即自动将它们转换。
但是,在这种情况下,我认为使用继承不合适。 如果您的Vec3
实施发生变化该怎么办? 如果您决定将您的成员设为私有(应该这样做)怎么办?
编辑-我在最后看到了您对泛型的评论。 那不是自动装箱的目的吗?
您不能只使用这样的泛型吗?
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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.