将类对象传递给函数(Kotlin)

将类对象传递给函数(Kotlin),kotlin,Kotlin,抱歉,如果这是个愚蠢的问题,但我可以解决 我有两节课 class A( val id: Int ) class B( val id: Int, val className: String ) 现在我想把一个对象传递给函数。我想做“uniwersal”函数。现在我必须做2个函数 参数类型为A fun printClassFields(classObject: A){ } 第二个参数是B fun printClassFieldsB(classObject: B){

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

我有两节课

class A(
    val id: Int
)

class B(
    val id: Int,
    val className: String
)
现在我想把一个对象传递给函数。我想做“uniwersal”函数。现在我必须做2个函数

参数类型为
A

fun printClassFields(classObject: A){

}
第二个参数是
B

fun printClassFieldsB(classObject: B){

}

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

不太清楚如何处理函数中的类,但这里有一些选项

您可以对所有公共字段使用
界面

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获得
智能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)
        }
    }
}

让B延伸A?