2013-04-10 81 views
0

我正在寫一個Ray Tracer,並且我有一個Vec3類,它是一個具有3個座標的典型數學向量:X,Y和Z.我還創建了一個Color類,它包含三個組件:R,G和B.在寫了大量代碼之後,我開始注意到Color基本上是一個Vec3。我開始爲Color編寫許多與Vec3相同的方法。看到DRY代碼是要走的路,我想合併這兩個類,所以我不必爲這兩個類繼續編寫相同的代碼。具有不同原始數據成員但相同方法的Java子類

既然這樣,這裏是類:

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之後已經有一段時間了。所以,我對這個問題的第一個本能答案是NO

+3

繼承在許多情況下是一種令人討厭的代碼重用形式。如果你真的想要(我不確定我會這樣做),我可以想象Color被* Vec3實現*但是你真的認爲它適合於擴展它,即使除了類型問題嗎? – 2013-04-10 15:36:13

+0

@JonSkeet同意。我會創建一個具有最高通用精度的類並使用它,假設我將要關聯這兩個類。或者切換到C++並使用templates + typedefs。 – ApproachingDarknessFish 2013-04-10 15:39:02

+0

我想'顏色'擴展'Vec3'的主要原因是GLSL將顏色視爲3(有時是4)分量向量。我還考慮過在特殊情況下只需使用'double's RGB顏色並將其轉換爲'int's。這很可能是我最終要做的。 – OozeMeister 2013-04-10 15:53:47

回答

0

我不是100%確定你在問什麼,但是如果你的代碼如你所示,你有沒有你想要的?在您的代碼中,Color extends Vec3。 由於此聲明,Color對象可被視爲Vec3對象;來自Vec3的所有方法都由Color繼承,而採用Vec3類型的arg的方法將接受Color類型的args。

0

每個基元都有其對應的類。例如,Integerint。 Java可以autobox它們,即自動轉換它們。

但是,我不認爲在這種情況下使用繼承是適當的。如果你Vec3實施變更?如果你決定讓你的會員變成私人(你應該怎麼做)?

0

編輯 - 我在最後看到您對泛型的評論。這不是自動裝箱的目的嗎?

難道你不能只使用這樣的泛型?

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; } 
} 
+0

我遇到的問題是,當我想要像'public void scale(T factor){this.x * = factor;如果唯一的區別是int和double,你可以使用GenericVector ,並使用public void scale(T factor){...}如果不知道如何處理'T * T;' – OozeMeister 2013-04-10 15:49:16

+0

this.x.doubleValue()* = factor; ...} – 2013-04-10 16:39:08

相關問題