gpt4 book ai didi

inheritance - 如何使用 proto-buffers 有效地完成继承

转载 作者:行者123 更新时间:2023-12-05 04:17:39 27 4
gpt4 key购买 nike

我有一个基类消息

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

和扩展动物的子类

message Dog{
optional string breed = 1;
}

所以在构建狗消息时,我应该能够设置动物的所有字段。我知道这样做的方式(在 dog 消息中再次声明所有动物字段)但是是否可以简单有效地使用 protobuffers?我还了解了扩展,我知道它只是用来向已经存在的消息添加一个新字段,所以它不应该被误解为实现继承的可能解决方案。

是否可以使用protobuffers的扩展来实现上述简单的设计?

最佳答案

有几种不同的方法可以在 Protocol Buffers 中实现“继承”。您想要哪一个取决于您的用例。

选项 1:子类包含父类(super class)

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

message Dog {
required Animal animal = 1;
optional string breed = 2;
}

这里,Dog包含了一个Animal,因此包含了Animal的所有信息。

如果您不需要支持向下转换,则此方法有效。也就是说,您永远不必说“这 AnimalDog 吗?”因此,任何可能需要访问 Dog 字段的内容都需要将 Dog 作为其输入,而不是 Animal。对于许多用例,这很好。

选项 2:父类(super class)包含所有子类

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

// Exactly one of these should be filled in, depending on the species.
optional Dog dog = 100;
optional Cat cat = 101;
optional Axolotl axolotl = 102;
// ...
}

在这种方法中,给定一个Animal,您可以找出它是哪种动物并访问特定于物种的信息。也就是说,你可以向下转型。

如果你有一个固定的“子类”列表,这很有效。只需列出所有这些,并记录只应填写其中一个字段。如果有很多子类,您可能需要添加一个枚举字段来指示存在哪一个,这样您就不必分别检查 has_dog(), has_cat(), has_mouse(), ...

选项 3:扩展

message Animal {
optional string name = 1;
optional int32 age = 2;
extensions 100 to max; // Should contain exactly one "species" extension.
}

message Dog {
optional string breed = 1;
}

extend Animal {
optional Dog animal_dog = 100;
// (The number must be unique among all Animal extensions.)
}

这个选项实际上在语义上与选项 #2 相同!唯一的区别是,您不是在 Animal 中声明许多可选字段,而是将它们声明为扩展。每个扩展有效地向 Animal 添加一个新字段,但您可以在其他文件中声明它们,因此您不必拥有一个中央列表,其他人无需编辑您的代码即可添加新扩展。由于每个扩展的行为就像一个常规字段,除了用于声明和访问它的语法有点奇怪之外,一切都与选项 #2 的行为相同。 (实际上,在此处的示例中,有线编码甚至是相同的,因为我们使用 100 作为分机号,而在选项 2 中我们使用 100 作为字段号。)

这是理解扩展的技巧。许多人感到困惑,因为他们试图将“扩展”等同于面向对象语言中的继承。不要那样做!请记住,扩展的行为就像字段一样,这里的选项 2 和 3 实际上是相同的。这不是继承...但它可以解决相同的问题。

关于inheritance - 如何使用 proto-buffers 有效地完成继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21474024/

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