繁体   English   中英

具有不同原始数据成员但方法相同的Java子类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM