有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在写一个光线跟踪器,我有一个Vec3类,这是一个典型的数学向量,有3个坐标:X、Y和Z。我还创建了一个包含3个分量的颜色类:R、G和B。在编写了大量代码后,我开始注意到颜色基本上是一个Vec3。我开始为颜色写很多和我为Vec3写的相同的方法。看到干代码是一种方法,我想合并这两个类,这样我就不必继续为两个类编写相同的代码

目前,课程如下:

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的组件使用双精度,而颜色使用整数。除了数据类型之外,所有方法都完全相同。我最初的倾向是尝试创建一个泛型类型T的BaseVec3类,然后在子类中声明该类型。但是,当然,泛型需要类,而不是基元

我有没有办法拥有一个单一的方法代码库,但使用不同的原始数据类型

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


共 (3) 个答案

  1. # 1 楼答案

    编辑-我在最后看到了你对泛型的评论。这不是自动装箱的目的吗

    你就不能用这样的通用词吗

    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; }
    }
    
  2. # 2 楼答案

    每个基元都有其相应的类。例如,Integer表示int。Java可以自动装箱,即自动转换

    然而,我不认为在这种情况下使用继承是合适的。如果Vec3实现发生变化怎么办?如果你决定让你的会员成为私人会员(你应该这样做),该怎么办

  3. # 3 楼答案

    我不是100%确定你在问什么,但如果你的代码是你所展示的,你没有你想要的吗?在代码中,Color extends Vec3。 由于该语句,可以将Color对象视为Vec3对象;Vec3中的所有方法都是按颜色继承的,采用Vec3类型的arg的方法将接受Color类型的arg