首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin:如何定义一个类型依赖于输入的变量?

Kotlin:如何定义一个类型依赖于输入的变量?
EN

Stack Overflow用户
提问于 2022-06-24 10:16:54
回答 2查看 49关注 0票数 0

我在Kotlin中有一个函数,它接受一个特定的字符串作为输入。根据输入,我希望创建一个特定类型的变量,并对其进行一些计算。

例如,

代码语言:javascript
复制
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条件都有相同的代码。我怎么能用这样的东西把所有这些放在一个街区里:

代码语言:javascript
复制
var point: if(input=="2d) Point2D::class else if(input=="2d-1") Point2DWithP1AsOrigin::class.....

我怎么能这么做?

EN

回答 2

Stack Overflow用户

发布于 2022-06-24 10:49:34

你可以做这样的事

代码语言:javascript
复制
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()
}

但是,重要的是,所有这些类共享相同的接口。因为它们需要有相同的方法才能对它们执行相同的操作。例如:

代码语言:javascript
复制
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
}
票数 2
EN

Stack Overflow用户

发布于 2022-06-24 10:56:47

您可以存储构造函数引用,然后调用所需的引用。

代码语言:javascript
复制
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)
}

输出

代码语言:javascript
复制
class Point2DWithP2AsOrigin
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72742526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档