簡體   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