将倒下的对象升回原子



以下是原始代码,

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否则。

社论:我知道这不是一个非常令人满意的答案。协议缓冲区不能实现真正的继承,因为我们无法提出任何似乎合理的设计。向后和向前兼容电线上的要求使这个问题比看起来要复杂得多。但是,在实践中,我们发现继承实际上很少是您想要的,而我提出的选择通常可以正常工作。我认为,继承对于接口(即带有行为方法的集合),但对消息没有(即包含简单数据的字段的集合)。

)。

相关内容

  • 没有找到相关文章

最新更新