将类对象传递给函数(科特林)

时间:2019-11-28 21:18:05

标签: kotlin

抱歉,这是一个愚蠢的问题,但是我可以解决

我有两个课

class A(
    val id: Int
)

class B(
    val id: Int,
    val className: String
)

现在,我想将其中一个对象传递给函数。我要执行“ universalsal”功能。目前,我必须执行2个功能。

参数类型为A

的一个
fun printClassFields(classObject: A){

}

第二个是参数B

fun printClassFieldsB(classObject: B){

}

是否可以使一个函数接受两个类?

1 个答案:

答案 0 :(得分:1)

对于函数内部的类,您想做什么不太清楚,但是这里有一些选择。

您可以将interface用于所有常见字段:

interface Common {
    val id: Int
}
class A(
    override val id: Int
) : Common

class B(
    override val id: Int,
    val className: String
) : Common

fun print(obj: Common) {
    print(obj.id)
}

如果您知道所有类型,则另一种解决方案是对函数进行硬编码,例如:

fun print(obj: Any) {
    when (obj) {
        is A -> { /* handle class A */ }
        is B -> { /* handle class B */ }
    }
}

在这里,您将从Kotlin获得Smart Cast,并且可以访问每个班级的字段。但是,您可以打开函数以使用任何可能不希望的输入作为调用。


另一种选择是使用Sealed Class,您可以在其中获得Smart Cast但限制参数类型。

sealed class SealedSuper(val id: Int)
class A(id: Int) : SealedSuper(id)
class B(id: Int, val className: String) : SealedSuper(id)

fun print(obj: SealedSuper) {
    when (obj) {
        is A -> { 
            print(obj.id)
        }
        is B -> {
            print(obj.id)
            print(obj.className)
        }
    }
}