假设我有 A
和 B
:
data class A(val a: String, val common: String)
data class B(val b: String, val common: String)
我能否有一个可接受任意参数的方法,并在其中使用common
?例如:
fun accept(val param: A|B) {
println(param.common)
}
假设我有 A
和 B
:
data class A(val a: String, val common: String)
data class B(val b: String, val common: String)
我能否有一个可接受任意参数的方法,并在其中使用common
?例如:
fun accept(val param: A|B) {
println(param.common)
}
密封类 基本上就是这样做的:
sealed class AorB (val common : String)
class A(val a: String, common: String) : AorB(common)
class B(val b: String, common: String) : AorB(common)
fun accept(param: AorB) {
println(param.common)
when(param) {
is A -> println(param.a)
is B -> println(param.b)
}
}
fun main() {
accept(A("a value", "common value"))
accept(B("b value", "common value"))
}
sealed class AorB (open val common : String)
。对于密封类加一分。 - Adam MillerchipA|B
工作的关键。 - David Soroko如果你让它们都实现一个共同的接口,并将该接口用作参数类型,则可以做到这一点:
interface HasCommon {
val common: String
}
data class A(val a: String, override val common: String) : HasCommon
data class B(val b: String, override val common: String) : HasCommon
fun accept(param: HasCommon) {
println(param.common)
}
fun main() {
accept(A("a", "a"))
accept(B("b", "b"))
}
输出:
a
b
另外一种更加函数化的方式是为每个类型定义多个版本的 accept
,并将共同的功能抽象出来:
data class A(val a: String, val common: String)
data class B(val b: String, val common: String)
fun accept(a: A) = printCommon(a.common)
fun accept(b: B) = printCommon(b.common)
fun printCommon(common: String) = println(common)
fun main() {
accept(A("a", "a"))
accept(B("b", "b"))
}
fun A.printCommon() = printCommon(common)
。 - Adam Millerchip
common
的原因是A
的common
与B
的common
无关。这两个属性可能拼写相同,但这并不重要;在Kotlin中,它们完全不同,因为它们之间没有继承关系。这种关系是所有答案以各种方式提供的。 - gidds