gpt4 book ai didi

java - 如何从 Java 代码在 Protocol Buffer 中设置子类字段?

转载 作者:行者123 更新时间:2023-12-01 13:43:25 27 4
gpt4 key购买 nike

我有一个动物猫和狗消息,但如果我创建一个对象,我不知道如何设置猫的去爪或狗的骨头埋葬字段。我想创建一只猫,并从中创建一个动物对象。

message Animal {
extensions 100 to max;
enum Type {
Cat = 1;
Dog = 2;
}
required Type type = 1;
}


message Cat {
extend Animal {
required Cat animal = 100;
}
optional bool declawed = 1;
}
message Dog {
extend Animal {
required Dog animal = 101;
}
optional uint32 bones_buried = 1;
}

我的测试类:

public class Test {
public static void main(String[] args) {
Animal.Builder animal = Animal.newBuilder().setType(Animal.Type.Cat);
Cat c = animal.getExtension(Cat.animal);

Cat cat = Cat.newBuilder().setDeclawed(true).build();

// animal = cat!
Animal a = animal.build();

}
}

最佳答案

小心! Protobuf 扩展不是子类。它们有时可以用作继承的替代品,但它们的工作方式与继承有很大不同。例如,您的 Animal 类型实际上可以同时一个 Cat 一个Dog同时扩展。

扩展实际上表现得像字段。每次扩展 Animal 时,实质上都是向 Animal 消息添加新字段。换句话说,你的原型(prototype)实际上相当于:

message Animal {
enum Type {
Cat = 1;
Dog = 2;
}
required Type type = 1;
optional Cat cat = 100;
optional Dog dog = 101;
}

message Cat {
optional bool declawed = 1;
}
message Dog {
optional uint32 bones_buried = 1;
}

唯一的区别是扩展可以在它们扩展的消息之外声明。

回想起来,我应该使用与“扩展”不同的词,以避免与继承混淆。

由于扩展只是字段,因此它们具有与字段访问器等效的访问器。您的代码应如下编写:

Animal animal = Animal.newBuilder()
.setType(Animal.Type.Cat);
.setExtension(Cat.animal,
Cat.newBuilder().setDeclawed(true))
.build();

顺便说一句,在您的示例中,您声明了您的扩展必需。这实际上是不允许的——永远不需要扩展,因为扩展本质上是可选的。如果实际上允许所需的扩展,那么您的原型(prototype)实际上会声明每个 Animal 都必须两者 CatDog 扩展名。

关于java - 如何从 Java 代码在 Protocol Buffer 中设置子类字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20517938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com