我在Kotlin中有一个函数,它接受一个特定的字符串作为输入。根据输入,我希望创建一个特定类型的变量,并对其进行一些计算。
例如,
fun compute(input: String): Any{
if(input=="2d"){
var point: Point2D;// Points2D - x: int, y: int
//initilize and do some computations
return point.findDistanceFromOrigin()
}else if(input=="2d-1"){
var point: Point2DWithP1AsOrigin;// Point2DWithP1AsOrigin - x: int, y: int
//initilize and do some computations
return point.findDistanceFromOrigin()
}else if(input=="2d-2"){
var point: Point2DWithP2AsOrigin;
//initilize and do some computations
return point.findDistanceFromOrigin()
}
.
.
.
}您可以在上面的例子中看到,我想根据输入初始化点的类型,并进行计算和返回。
除了变量的定义之外,所有if- All条件都有相同的代码。我怎么能用这样的东西把所有这些放在一个街区里:
var point: if(input=="2d) Point2D::class else if(input=="2d-1") Point2DWithP1AsOrigin::class.....我怎么能这么做?
发布于 2022-06-24 10:49:34
你可以做这样的事
fun compute(input: String): Any{
val point: MyPoint = when(input) {
"2d" -> Point2D()
"2d-1" -> Point2DWithP1AsOrigin()
"2d-2" -> Point2DWithP2AsOrigin()
else -> Point2D() //fallback is necessary
}
//initilize and do some computations
return point.findDistanceFromOrigin()
}但是,重要的是,所有这些类共享相同的接口。因为它们需要有相同的方法才能对它们执行相同的操作。例如:
class Point2D : MyPoint {
override fun findDistanceFromOrigin() = 5
}
class Point2DWithP1AsOrigin : MyPoint{
override fun findDistanceFromOrigin() = 6
}
class Point2DWithP2AsOrigin : MyPoint{
override fun findDistanceFromOrigin() = 7
}
interface MyPoint {
fun findDistanceFromOrigin() : Int
}发布于 2022-06-24 10:56:47
您可以存储构造函数引用,然后调用所需的引用。
fun main() {
val constructors = mapOf(
"2d" to ::Point2D,
"2d-1" to ::Point2DWithP1AsOrigin,
"2d-2" to ::Point2DWithP2AsOrigin,
)
val type = "2d-2"
val constructor = constructors[type] ?: throw IllegalArgumentException("$type not supported")
val point = constructor()
println(point::class)
}输出
class Point2DWithP2AsOriginhttps://stackoverflow.com/questions/72742526
复制相似问题