我正在开发的程序中有类似于以下代码的东西(只有更多参数):
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))
}
}
我想这样做,以便程序能够接受第一个参数的Position2D
对象和第二个参数的两个Doubles
,或者两个Doubles
第一个参数和2 nd 参数的Vector2D
对象,而不为每个参数组合创建更多this
语句。我知道可以使用类似的东西:
def this(posObj: Either[Position2D, Array[Double]], velObj: Either[Vector2D, Array[Double]]) = {...}
然后测试以查看posObj
和velObj
的类型;但是,我很好奇是否有办法做到这一点,而不要求Either
的2 nd 部分只是一个项目,例如Array
,所以你可以像下面这样初始化Particle
:
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)
答案 0 :(得分:2)
简短的回答是否定的,构造函数是严格的,因为方法(或本例中的构造函数)的参数数量(假设您不希望它们在Seq中)必须非常具体。< / p>
可能通过将裸对封装在Tuple2中并创建一个类型类实例来解压每个这样的实例,但这比仅添加构造函数要复杂一个数量级。
答案 1 :(得分:2)
可能的解决方案是在构造函数中创建包含2个参数列表的类,一个使用Position2D
,另一个使用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