抱歉,这是一个愚蠢的问题,但是我可以解决
我有两个课
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){
}
是否可以使一个函数接受两个类?
答案 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)
}
}
}