3

假设我有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)
}
4

3 回答 3

4

密封类几乎可以做到:

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")) 
}

于 2020-11-03T10:57:50.110 回答
3

如果你让它们都实现一个通用接口,并且使用接口作为参数的类型,你可以这样做:

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"))
}
于 2020-11-03T10:51:09.473 回答
1

继承应该解决这个问题

毕竟,接受任何一个都意味着你不能在它们上调用任何特定的方法,除非你强制转换它们。

这与在 Kotlin 中接受“Any”是一样的。

一种解决方法是定义 2 种方法,其中一种方法可以在转换后调用另一种方法。

或者你让类继承,但你正在使用数据类,所以我假设你已经知道这对它们来说并不容易。

使用数据类继承的一种解决方法

于 2020-11-03T10:26:37.273 回答