将下载的对象向上转换回protobuffers

时间:2014-02-01 10:20:56

标签: upcasting protocol-buffers

以下是原型代码,

message Animal {
    optional string name = 1;
    optional int32 age = 2;  
}    

message Dog{
    optional string breed = 1;
}

然后使用上面的原型

的样本类
public class InheritanceTest {

    public static void main(String[] args){
        Dog dog = Dog.getDefaultInstance();
        printAnimalName(dog.getAnimal());
    }

    public static void printAnimal(Animal animal){
        Dog dog = (Dog)animal; // Not at all possible right!
    }

} 

只有在动物身上有一个“必需”的狗实例才能进行上传吗?或者还有其他任何向上的方式吗?

1 个答案:

答案 0 :(得分:1)

首先,要明确:“向上转换”意味着将Dog投射到Animal。 “向下转发”意味着将Animal投射到Dog。你的问题是关于如何转播,但你的例子似乎是关于向下倾斜。我会尝试回答这两个问题。

my answer to your other question中,我提出了三个使用protobufs模拟继承的选项。

选项1使向上转换变得容易,但不允许向下转发。

选项2和3可以进行向下转换,但不支持向上转换。

如果您需要同时进行向上转发和向下转发,则需要使用选项2或3,但始终只需Animal传递Animal。也就是说,如果您有一个Dog上工作的功能,但需要访问Animal的某些成员,则必须使用Animal作为其论点。函数的文档应该声明即使参数类型是Animal,参数也必须设置dog字段(或扩展名),即它必须实际上是Dog。否则你应该抛出IllegalArgumentException

编辑:我知道这不是一个非常令人满意的答案。 Protocol Buffers没有实现真正的继承,因为我们无法提出任何看似合理的设计。对线缆的向后兼容性的要求使得这个问题比看起来要复杂得多。但实际上,我们发现继承实际上很少是你想要的,我提出的选项之一通常都可以正常工作。在我看来,继承对于接口(即方法行为的集合)是有意义的,但对于消息(即包含简单数据的字段集合)则不然。