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