用Java/Scala中的方法定义协调thrift中的继承不足
我已经在用Java/Scala中的方法定义协调thrift中的继承不足,java,scala,oop,inheritance,thrift,Java,Scala,Oop,Inheritance,Thrift,我已经在Thrift中定义了一组结构。从概念上讲,其中一些结构是公共父类的子类。由于Thrift不支持结构继承,因此我使用以下策略来定义结构: 例子 说A和B是父类型p的子类型。以下是我对节俭的定义: struct P { 1: i32 childType, 2: list<byte> payload } struct A { 1: i32 x } struct B { 1: i32 y } struct P{ 1:i32子类型, 2:列出有效载荷 } 结构A{
Thrift
中定义了一组结构。从概念上讲,其中一些结构是公共父类的子类。由于Thrift
不支持结构继承,因此我使用以下策略来定义结构:
例子
说A
和B
是父类型p
的子类型。以下是我对节俭的定义:
struct P {
1: i32 childType,
2: list<byte> payload
}
struct A {
1: i32 x
}
struct B {
1: i32 y
}
struct P{
1:i32子类型,
2:列出有效载荷
}
结构A{
1:i32 x
}
结构B{
1:i32 y
}
类型A和B
的对象被序列化为类型p
的记录(有效载荷
字段将存储对象的序列化版本,子类型
的值将指示序列化的有效载荷是类型A还是B
)。在反序列化过程中,childType
字段的值将指示如何反序列化有效负载
然而,当使用面向对象语言(如Java或Scala)编写代码时,这种方法会带来困难。例如,在返回类型P
的对象的函数中,我不能返回类型a
或类型B
的结果
问题:
(i) 有没有一个建议的方法来处理这个问题?也就是说,如何协调节俭
与Java/Scala
利用继承的代码中继承的缺失
提前感谢。我不知道Java/Scala是否有更好的方法,但在我们的例子中,添加一个指向其“超级”Thrift结构的额外Thrift结构成员就是我们想要的
struct Foo {
1: i32 wtf
}
struct Bar {
1 : Foo super_
2 : double moredata
}
当然,这只是一种变通办法,但我们可以接受。另一种变通办法是使用节俭工会,尽管工会对节俭的支持(至少在某些语言中)不是很好。看
我将您的示例稍作更改(B.y现在是字符串),以提供更好的示例。考虑这个节约文件:
struct A {
1: i32 x
}
struct B {
1: string y
}
union P {
1: A a,
2: B b
}
在thrift compiler 0.9.0生成的Java代码中,p类有多个方法可用于确定p是否包含A或B:isSetA
/isSetB
,getA
/getB
,并返回指定类型的枚举
生成的代码:,和此时不存在文件A.java、B.java或p.java。