首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查该对象是Kotlin中多种类型之一。

检查该对象是Kotlin中多种类型之一。
EN

Stack Overflow用户
提问于 2019-01-22 12:26:46
回答 2查看 894关注 0票数 4

我有以下课程:

代码语言:javascript
复制
sealed class A : BaseType
sealed class B : BaseType
sealed class C : BaseType

...

如果我有一个如下所示的processObject方法:

代码语言:javascript
复制
fun processObject(obj: BaseType): Int {
  return when(obj) {
    is A -> 1
    is B -> 1
    else -> 0
  }
}

我注意到我现在在重复自己,所以我可能会将该方法更改为如下所示:

代码语言:javascript
复制
fun processObject(obj: BaseType): Int {
  return when(obj) {
    is A, is B -> 1
    else -> 0
  }
}

然而,当类的数量从3-4到40+时,(我认为)这看起来非常难看。我正在考虑按照下面的伪代码来做一些事情:

代码语言:javascript
复制
// store all the possible types in a list
val typesThatShouldReturn1 = listOf<BaseType>(
  // TODO: figure out how to store types in a list without instantiating
)

fun processObject(obj: BaseType): Int {
  if (typesThatShouldReturn1.any { obj is it }) {
    return 1
  }
  return 0
}

这在科特林有可能吗?

Re:一些评论.

为什么我不使用标记界面?因为这个processEvent函数将在许多不同的上下文中实现,因此为每个上下文引入标记接口并不是一个好的解决方案。此外,baseType类是CQRS系统的一部分,理想情况下,写入逻辑不应该与读取逻辑有关。这就是为什么标记界面对我来说不可行的最大原因。

为什么BaseType不实现这个逻辑?请参阅上面关于在不同上下文中以不同方式实现processEvents的评论。此外,基本类型没有读取逻辑作为关注,这就是为什么它永远不应该实现这一点。

listOf(A::class, B::class, C::class, ...)看起来比is A, is B, is C, ...好看吗?看上去差不多一样。有效点。这是更个人的偏好,因为我不介意private val typesThatShouldReturn1几乎一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-22 12:54:25

当然,你可以写这样的东西

代码语言:javascript
复制
val typesThatShouldReturn1 = listOf(
  A::class
)

fun processObject(obj: BaseType): Int {
  if (typesThatShouldReturn1.any { it.isInstance(obj) }) {
    return 1
  }
  return 0
}
票数 6
EN

Stack Overflow用户

发布于 2019-01-23 14:42:27

您的例子还不清楚,但您似乎试图这样做:

代码语言:javascript
复制
sealed class BaseType
class A : BaseType
class B : BaseType
class C : BaseType

(这意味着BaseType只能是ABC中的一种--这与您希望使用的when是一致的)

实际上,您要说的是,AB本质上是相似的,应该以相同的方式处理。假设AB实际上需要是单独的类,一个解决方案是它们共享一个公共超类,而实际上不是BaseType

代码语言:javascript
复制
sealed class BaseType
open class ABCommon : BaseType
class C : BaseType

class A : ABCommon
class B : ABCommon

fun processObject(obj: BaseType): Int {
  return when(obj) {
    is ABCommon -> 1
    else -> 0
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54308308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档