如何在Kotlin中定义一组具有严格关系的类对
我不熟悉Kotlin,并试图“抓住”它 我给自己做了一个练习,我希望定义一组相关的类对,但有以下限制 以下伪代码说明了我想要的设计:- 我想声明一个函数,它接受一个输入并生成一个输出,如下所示如何在Kotlin中定义一组具有严格关系的类对,kotlin,Kotlin,我不熟悉Kotlin,并试图“抓住”它 我给自己做了一个练习,我希望定义一组相关的类对,但有以下限制 以下伪代码说明了我想要的设计:- 我想声明一个函数,它接受一个输入并生成一个输出,如下所示 fun process(input : Input) : Output 我将声明通用接口,如下所示:- interface Input<I> { val input: I } interface Output<O> { val output: O } 当Cus
fun process(input : Input) : Output
我将声明通用接口,如下所示:-
interface Input<I> {
val input: I
}
interface Output<O> {
val output: O
}
当CustomInput\N
被传递到process
函数时,它只能生成(返回)CustomOutput\N
我如何使用Kotlin来实现这些关系?我的类的用户没有“破坏”这些规则吗
此外,是否可以强制执行
CustomInput\u 1
仅为已传递类型CustomData\u 1
,CustomOutput\u 1
仅为已传递类型CustomData\u 2
等?强制执行的唯一方法是将输出接口类型添加到输入接口(反之亦然)
处理这些内容的函数必须是抽象的,并且必须为每种类型的输入/输出定义具体的实现(或者使用一个uber函数,该函数充满了类型检查,而不是利用多态性,这将是混乱和难以维护的)
接口输入{
val输入:I
}
接口输出{
val输出:0
}
数据类CustomInput_1(覆盖val输入:CustomData_1):输入
数据类CustomOutput_1(覆盖val输出:CustomData_2):输出
接口处理器{
fun foo(输入:II):O
}
如果定义一个处理和输入并生成输出的单一接口,任务将简单得多:
interface Processor <in I, out O> {
fun process(input: I): O
}
接口处理器{
乐趣过程(输入:I):O
}
然后,处理器的具体实现可以声明哪对输入/输出组合在一起:
class MyProcessor1: Processor<CustomData_1, CustomData_2> {
override fun process(input: CustomData_1): CustomData_2 {
return input.toCustomData2()
}
}
类MyProcessor1:处理器{
覆盖乐趣流程(输入:CustomData_1):CustomData_2{
返回input.toCustomData2()
}
}
或者,为了强制执行有限对集,可以使用密封类而不是接口。然后,必须在同一文件中定义所有有效的输入/输出对
sealed class Processor <in I, out O> {
abstract fun process(input: I): O
}
密封类处理器{
抽象趣味过程(输入:I):O
}
不清楚您希望在何处实施这些规则。是否要更改CustomOutput\u X
和CustomInput\u X
的声明,使过程只能以这种方式写入?或者,您是否希望找到一种方法来声明进程
,以便编译器了解对应关系并根据参数正确推断返回类型?“此外,是否可以强制执行CustomInput\u 1
仅传递类型CustomData\u 1
“这不是已经强制执行了吗?@Sweeper我想在定义每对类时强制执行这些规则,例如CustomInput\N和CustomOutput\N我喜欢使用密封类的想法,但是,我不知道如何定义CustomInput和CustomOutput类之间存在1-2-1关系的限制。在输入界面中提到输出类型感觉是错误的“任务会简单得多”之后的所有内容都是我建议的解决方案,与上面的代码无关。我认为在输入/输出包装器类中定义1-2-1限制毫无意义。它应该在建立它们之间链接的处理器中定义。
interface Processor <in I, out O> {
fun process(input: I): O
}
class MyProcessor1: Processor<CustomData_1, CustomData_2> {
override fun process(input: CustomData_1): CustomData_2 {
return input.toCustomData2()
}
}
sealed class Processor <in I, out O> {
abstract fun process(input: I): O
}