以下是原型代码,
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!
}
}
只有在动物身上有一个“必需”的狗实例才能进行上传吗?或者还有其他任何向上的方式吗?
答案 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
。