今私はRealVector
クラスとComplexVector
クラスを持っています。それらのロジックはほぼ同じですので、それらを1つのVector
クラスに結合したいと思います。 RealVector
はList[Double]
であり、ComplexVector
はList[ComplexNumber]
であり、ComplexNumber
は私が作成したケースクラスです。2つの異なる型を許可するために、どのように私のケースクラスコンストラクタをオーバーロードするのですか?
私のcase class Vector
は、List
のいずれかのタイプを受け入れます。ほとんどのメソッドのコードは同一ですが、List
タイプに応じて、Double
またはComplexNumber
を返すことがあります。このインスタンスでは、ケースクラスを使用することも正しいですか、または通常のクラスを使用する必要がありますか?
編集:私の現在のコード
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