以下是原始代码,
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!
}
}
只有将狗的实例作为动物中的"必需",才可以进行上升?还是还有其他提升方式?
首先,要清楚:"向上"是指将Dog
施放到Animal
。"降低"是指将Animal
施放到Dog
。您的问题是关于如何提升的,但是您的示例似乎是关于降落的。我会尝试两者回答。
在我对您的另一个问题的回答中,我提出了三个与Protobufs模拟继承的选择。
选项1组成简单,但不允许降低。
选项2和3使降落降低,但不支持向上。
如果您需要能够升级和降低,则需要使用选项2或3,但始终将Animal
绕过Animal
。也就是说,如果您的函数仅在Dog
上起作用,但也需要访问Animal
的某些成员,则必须将Animal
作为其参数。该函数的文档应声明,即使参数类型为Animal
,该参数也必须具有dog
字段(或扩展)集,即实际上必须是Dog
。您应该扔一个IllegalArgumentException
否则。
社论:我知道这不是一个非常令人满意的答案。协议缓冲区不能实现真正的继承,因为我们无法提出任何似乎合理的设计。向后和向前兼容电线上的要求使这个问题比看起来要复杂得多。但是,在实践中,我们发现继承实际上很少是您想要的,而我提出的选择通常可以正常工作。我认为,继承对于接口(即带有行为的方法的集合),但对消息没有(即包含简单数据的字段的集合)。
)。