我有两个classes
DTO
class FooDto (
val a: String,
val b: Double,
)
class BarDto (
val c: String,
val d: String,
)
现在,我想定义第三个AnotherDto
,将属性的类型设置为BartDto
或FooDto
。
class AnotherDto (
val e: FooDto || BarDto
)
这显然是行不通的。我读到,sealed classes
它看起来像这样
sealed class Menu{
data class PIZZA(val name: String, val size:String, val quantity:Int):Menu()
data class BURGER(val quantity:Int, val size:String): Menu()
data class CHICKEN(val quantity:Int, val pieces:String):Menu()
}
但是,这需要我再次定义所有变量(例如name: String
和quanitity: Int
)。这不是我想要的,我只是想重用我之前定义的FooDto
而不BarDto
重复。
所以这
sealed class FooBar{
data class Foo(val a: String, val b: Double):FooBar()
data class Bar(val c: String, val d: String): FooBar()
}
有点毫无意义,因为我FooDto
已经BarDto
写过并且它们在其他地方使用。我想要这样的东西
sealed class FooBar{
FooDto:FooBar()
BarDto: FooBar()
}
这显然是行不通的。
如何重用我已经编写的DTO
sFooDto
并BarDto
创建一个“联合类型”,我可以将其作为数据类型分配给 Kotlin 中的变量?
我认为你不应该在这里拒绝常规继承。此外,公共接口可能比密封类更合适。
如果你想要这个:
然后
FooDto
和BarDto
必须实现某种通用功能才能使该属性e
有用。因此,无论什么常见功能,都将其写入接口1中:
FooDto
然后你可以实现和BarDto
2中的接口并得到:但这看起来仍然没有完成,因为大概您希望
AnotherDto
看起来像一个常规Dto
对象。然后你可以使用委托功能,并且将代替传递到其构造函数中AnotherDto
的任何其他功能:Dto
1密封/抽象类也是可能的,但是当实现类耦合度较低时,接口会更灵活
2是的,它涉及更改这些类别;但是联合类型至少在没有共享接口的情况下是没有用的(除非您要使用反射或类似的方法,这肯定是最后的手段)
您可以使用
Either
-class。您可以使用 Arrow ( https://apidocs.arrow-kt.io/arrow-core/arrow.core/-either/index.html )等库中预先存在的库,或者自己实现一个库,如下所示:在调用站点,您现在可以执行以下操作: