使用Java / Scala

时间:2017-01-19 23:34:47

标签: java scala oop inheritance thrift

我在Thrift中定义了一组结构。从概念上讲,这些结构中的一些是公共父类的子类。由于Thrift不支持结构继承,因此我使用以下策略来定义结构:

实施例

AB是父type P的子类型。以下是我的节俭定义来表示:

struct P {
  1: i32 childType,
  2: list<byte> payload
}

struct A {
  1: i32 x
}

struct B {
  1: i32 y
}

type A and B的对象被序列化为type P的记录(payload字段将存储对象的序列化版本,childType的值将指示是否序列化有效载荷为type A or B)。在反序列化期间,childType字段的值将指示payload需要如何反序列化。

但是,在使用Java或Scala等面向对象语言编写代码时,这种方法会带来困难。例如,在返回type P对象的函数中,我无法返回type Atype B的结果。

问题

(i)是否有建议的方法来处理这个问题?也就是说,如何将Thrift中缺少继承与使用继承的Java/Scala代码进行协调?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我无法判断Java / Scala是否有更好的方法,但在我们的例子中,添加一个指向其“超级”Thrift结构的额外Thrift结构成员可以实现我们想要的。

struct Foo {
    1: i32 wtf
}

struct Bar {
    1 : Foo super_
    2 : double moredata
}

当然,这只是一种解决方法,但我们可以忍受。

答案 1 :(得分:0)

另一种解决方法是使用节俭联盟,尽管对节俭的联盟支持(至少在某些语言中)并不是很好。请参阅docs

我正在改变你的样本(B.y现在是字符串)给出一个更好的例子。考虑这个节俭文件:

struct A {
  1: i32 x
}

struct B {
  1: string y
}

union P {
    1: A a,
    2: B b
}

在thrift编译器0.9.0生成的Java代码中,P类有多种方法可用于确定P是否包含A或B:isSetA / isSetBgetA / getBgetSetField返回指定类型的枚举。

生成的代码:A.javaB.javaP.java