現在我有一個RealVector
類和ComplexVector
類。他們的邏輯幾乎完全相同,所以我想將它們合併成一個Vector
類。 RealVector
需要List[Double]
而ComplexVector
需要List[ComplexNumber]
其中ComplexNumber
是我創建的案例類。如何重載我的案例類構造函數以允許兩種不同的類型?
我該怎麼做才能讓我的case class Vector
接受兩種List
類型之一?請注意,雖然大多數方法的代碼是相同的,但其中一些方法可能會返回Double
或ComplexNumber
,具體取決於List
類型。在這種情況下使用case類還是正確的,還是應該使用普通類?
編輯:我當前的代碼
trait VectorElement[A]
implicit object RealVectorElement extends VectorElement[Double]
implicit object ComplexVectorElement extends VectorElement[ComplexNumber]
case class MyVector[A: VectorElement](components: List[A]) {
def +(that:MyVector[A]):MyVector[A] = {
if (this.dimension != that.dimension) throw new Exception("Cannot add MyVectors of different dimensions.");
new MyVector((this.components zip that.components).map(c => c._1 + c._2));
}
def -(that:MyVector[A]):MyVector[A] = {
if (this.dimension != that.dimension) throw new Exception("Cannot subtract MyVectors of different dimensions.");
new MyVector((this.components zip that.components).map(c => c._1 - c._2)); // ERROR HERE: error: value - is not a member of type parameter A
}
...
}
太寬泛得到建設性的答案,而不是超載,可能是各種更好的解決方案,作爲'trait',genericity,typeclass,... https://stackoverflow.com/help/how-to-ask – cchantep
輔助構造函數需要調用主構造函數,這可能會使方法難以確定使用哪個構造函數。 – jwvh