作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个库,可以生成一大堆看起来非常相似的 Java 类。为简洁起见,让我们在 Kotlin 中指定类似的内容:
data class A(val commonParam1: String, val commonParam2: String, val specialParam: Int)
data class B(val commonParam1: String, val commonParam2: String, val specialParam: String)
data class C(val commonParam1: String, val commonParam2: String, val specialParam: Boolean)
data class D(val commonParam1: String, val commonParam2: String, val specialParam: Float)
data class G<T>(val commonParam1: String, val commonParam2: String, val specialParam: T)
MutationInputs
这些都非常相似。我们不直接控制模式的形状。由于每个突变也有自己的输入和输出类型,即使我大量使用片段,构建这些突变并解释它们的输出也是一件苦差事,因为即使是提取片段的代码也必须重复。
最佳答案
我在这里列出了多个选项,其中一些可能会组合使用以重用代码并生成最少数量的繁琐代码。
具有默认实现的接口(interface)
您可以使用具有默认函数实现的接口(interface)来提供公共(public)基础:
interface CommonDataInterface<T> {
val commonParam1: String
val commonParam2: String
val specialParam: T
fun foo() { ...implementation here }
fun bar() { ...implementation here }
fun zoo(x: T): T { ...implementation here }
}
// concrete variations, using common interface functions implemented above:
data class A(override val commonParam1: String,
override val commonParam2: String,
override val specialParam: Int)
: CommonDataInterface<Int>
data class B(override val commonParam1: String,
override val commonParam2: String,
override val specialParam: String)
: CommonDataInterface<String>
data class C(override val commonParam1: String,
override val commonParam2: String,
override val specialParam: Boolean)
: CommonDataInterface<Boolean>
data class D(override val commonParam1: String,
override val commonParam2: String,
override val specialParam: Float)
: CommonDataInterface<Float>
class G<T>(val commonParam1: String, val commonParam2: String, val specialParam: T) {
fun foo() { ...implementation here }
fun bar() { ...implementation here }
fun zoo(x: T): T { ...implementation here }
}
// concrete variations, using common functions from base class
class A(commonParam1: String, commonParam2: String, specialParam: Int)
: G<Int>(commonParam1, commonParam2, specialParam)
class B(commonParam1: String, commonParam2: String, specialParam: String)
: G<String>(commonParam1, commonParam2, specialParam)
class C(commonParam1: String, commonParam2: String, specialParam: Boolean)
: G<Boolean>(commonParam1, commonParam2, specialParam)
class D(commonParam1: String, commonParam2: String, specialParam: Float)
: G<Float>(commonParam1, commonParam2)
interface CommonDataInterface {
val commonParam1: String
val commonParam2: String
fun foo()
fun bar()
}
data class CommonData(override val commonParam1: String,
override val commonParam2: String)
: CommonDataInterface {
override fun foo() { ...implementation here }
override fun bar() { ...implementation here }
}
// concrete implementations using common functions via automatic delegation
data class A(private val common: CommonDataInterface,
val specialParam: Int) : CommonDataInterface by common {
fun zoo(x: Int): Int { ...implementation here using specialParam }
}
data class B(private val common: CommonDataInterface,
val specialParam: String) : CommonDataInterface by common {
fun other(y: String): String { ...implementation here using specialParam }
}
data class C(private val common: CommonDataInterface,
val specialParam: Boolean) : CommonDataInterface by common
data class D(private val common: CommonDataInterface,
val specialParam: Float) : CommonDataInterface by common
specialParam
由任何通用功能使用,并且将按特化实现。
关于kotlin - 以多态方式处理大量相似的单态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59197837/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!