1

私が開発しているプログラムには、次のコードに似たものがあります (より多くのパラメーターのみ)。

class Particle {
   //variables
   def this(position: Position2D, velocity: Vector2D) = {
   this()
   //constructors
   }

   def this(xPos: Double, yPos: Double, magnitude: Double, angle: Double) = {
   this(new Position2D(xPos, yPos), new Vector2D(magnitude, angle))
   }
}

そして、プログラムが最初のパラメーターのオブジェクトと 2番目のパラメーターの 2 つ、または最初のパラメーターの2 つと 2番目Position2Dのパラメーターのオブジェクトを受け入れることができるようにしたいと思います。パラメータの。次のようなものを使用できることを知っています。DoublesDoublesVector2Dthis

def this(posObj: Either[Position2D, Array[Double]], velObj: Either[Vector2D, Array[Double]]) = {...}

posObj次に、 と がどのような型であるかをテストしますvelObj。ただし、次のように初期化できるように、 の 2番目の部分をEitherなどの 1 つのアイテムにする必要なく、これを行う方法があるかどうかに興味がありました。ArrayParticle

val a = new Particle(new Position(3, 6), 30, 5)
val b = new Particle(3, 6, new Vector2D(30, 5))
val c = new Particle(new Position(3, 6), new Vector2D(30, 5))
val d = new Particle(3, 6, 30, 5)
4

2 に答える 2

2

簡単な答えはノーです。コンストラクターは、メソッド(この場合はコンストラクター)のパラメーターの数(この場合はコンストラクター)が非常に具体的でなければならないという意味で厳密です。

ネイキッドペアをTuple2で囲み、それぞれをアンパックするタイプクラスインスタンスを作成することで可能になる可能性がありますが、コンストラクターを追加するよりも桁違いに複雑になります。

于 2012-10-02T22:35:06.687 に答える
2

Position2Dこれに対する解決策として考えられるのは、コンストラクターで 2つのパラメーター リストを使用してクラスを作成するVector2DことTuple2です。

case class Vector2D(x: Double, y: Double)
case class Position2D(x: Double, y: Double)

implicit def tuple2Vector2D(t: (Double,Double)): Vector2D = Vector2D(t._1, t._2)
implicit def tuple2Position2D(t: (Double,Double)): Position2D = Position2D(t._1, t._2)

class Particle(val v: Vector2D)(val p: Position2D)

scala> new Particle(1.1,3.1)(6.1,0.3)
res15: Particle = Particle@15a74f84

scala> new Particle(new Vector2D(1.1,3.1))(6.1,0.3)
res16: Particle = Particle@47283198

scala> new Particle(1.1,3.1)(new Position2D(6.1,0.3))
res17: Particle = Particle@2571e404

scala> new Particle(new Vector2D(1.1,3.1))(new Position2D(6.1,0.3))
res18: Particle = Particle@38be7bc0
于 2012-10-03T00:02:36.097 に答える