我正在寫一個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。
繼承在許多情況下是一種令人討厭的代碼重用形式。如果你真的想要(我不確定我會這樣做),我可以想象Color被* Vec3實現*但是你真的認爲它適合於擴展它,即使除了類型問題嗎? – 2013-04-10 15:36:13
@JonSkeet同意。我會創建一個具有最高通用精度的類並使用它,假設我將要關聯這兩個類。或者切換到C++並使用templates + typedefs。 – ApproachingDarknessFish 2013-04-10 15:39:02
我想'顏色'擴展'Vec3'的主要原因是GLSL將顏色視爲3(有時是4)分量向量。我還考慮過在特殊情況下只需使用'double's RGB顏色並將其轉換爲'int's。這很可能是我最終要做的。 – OozeMeister 2013-04-10 15:53:47