OpenAPI 中的多个 inheritance/composition / JSON 模式
Multiple inheritance/composition in OpenAPI / JSON Schema
在 OpenAPI 中,继承是通过 allof
实现的。例如,在 this example:
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet" # <--- here
},
[...]
]
},
"NewPet": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
}
},
我没有在规范中找到任何关于多重继承的信息。例如,如果 Pet 继承自 NewPet 和 OldPet。
在Python中,我会写
class Pet(NewPet, OldPet):
...
并且方法解析顺序对于 methods/attributes 应该首先检查哪个父 class 是确定性的,所以我可以判断 Pet.age 是否是新的 Pet.age 或老Pet.age.
那么,如果我让 Pet 从 NewPet 和 OldPet 继承,其中名称 属性 在两个模式中定义,每个模式中都有不同的值怎么办? Pet.name 是什么?
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet" # <--- multiple inheritance
"$ref": "#/definitions/OldPet"
},
[...]
]
},
"NewPet": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
}
},
"OldPet": {
"type": "object",
"properties": {
"name": {
"type": "integer" # <-- name redefined here, different type
},
}
},
OldPet 会优先吗?新宠物?是undefined/invalid?它是应用程序定义的吗?
我在 swagger-editor 试过这个。显然,具有两个引用的模式是有效的,但 swagger-editor 不解析属性。如果只显示带有两个引用的 allof。
编辑:根据this tutorial,在同一个 allof 中有多个引用是有效的。但是对于两个模式具有同名的不同属性的情况没有任何说明。
JSON 架构不支持继承。 allOf
的行为有时看起来像继承,但如果你这样想,你最终会感到困惑。
allOf
关键字的意思就是它所说的:所有模式都必须验证。没有任何事情会被覆盖或优先于其他任何事情。一切都必须验证。
在您的示例中,JSON 值必须针对 "NewPet" 和 "OldPet" 进行完整验证。因为没有可以同时验证为字符串和整数的 JSON 值,所以 "name" 属性 的验证将始终无法验证 "NewPet" 或 "OldPet"(或两者)。因此,"Pet" 模式永远不会针对任何给定的 JSON 值进行验证。
需要考虑的一件事是继承的含义。在 Eclipse Modeling Framework 中,尝试创建一个 class 来扩展具有相同属性的 2 classes 是错误的。尽管如此,我还是认为多重继承。
这就是所谓的钻石问题。参见 https://en.wikipedia.org/wiki/Multiple_inheritance
在 OpenAPI 中,继承是通过 allof
实现的。例如,在 this example:
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet" # <--- here
},
[...]
]
},
"NewPet": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
}
},
我没有在规范中找到任何关于多重继承的信息。例如,如果 Pet 继承自 NewPet 和 OldPet。
在Python中,我会写
class Pet(NewPet, OldPet):
...
并且方法解析顺序对于 methods/attributes 应该首先检查哪个父 class 是确定性的,所以我可以判断 Pet.age 是否是新的 Pet.age 或老Pet.age.
那么,如果我让 Pet 从 NewPet 和 OldPet 继承,其中名称 属性 在两个模式中定义,每个模式中都有不同的值怎么办? Pet.name 是什么?
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet" # <--- multiple inheritance
"$ref": "#/definitions/OldPet"
},
[...]
]
},
"NewPet": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
}
},
"OldPet": {
"type": "object",
"properties": {
"name": {
"type": "integer" # <-- name redefined here, different type
},
}
},
OldPet 会优先吗?新宠物?是undefined/invalid?它是应用程序定义的吗?
我在 swagger-editor 试过这个。显然,具有两个引用的模式是有效的,但 swagger-editor 不解析属性。如果只显示带有两个引用的 allof。
编辑:根据this tutorial,在同一个 allof 中有多个引用是有效的。但是对于两个模式具有同名的不同属性的情况没有任何说明。
JSON 架构不支持继承。 allOf
的行为有时看起来像继承,但如果你这样想,你最终会感到困惑。
allOf
关键字的意思就是它所说的:所有模式都必须验证。没有任何事情会被覆盖或优先于其他任何事情。一切都必须验证。
在您的示例中,JSON 值必须针对 "NewPet" 和 "OldPet" 进行完整验证。因为没有可以同时验证为字符串和整数的 JSON 值,所以 "name" 属性 的验证将始终无法验证 "NewPet" 或 "OldPet"(或两者)。因此,"Pet" 模式永远不会针对任何给定的 JSON 值进行验证。
需要考虑的一件事是继承的含义。在 Eclipse Modeling Framework 中,尝试创建一个 class 来扩展具有相同属性的 2 classes 是错误的。尽管如此,我还是认为多重继承。
这就是所谓的钻石问题。参见 https://en.wikipedia.org/wiki/Multiple_inheritance